this 决定在於函式如何被呼叫
以下为各个案例
1.变数指定物件下的方法,并执行
var name = 'GlobalName';
function foo() {
console.log(this.name);
}
var obj = {
name: 'tom',
foo: foo,
};
obj.foo() //tom(物件的方法调用)
var callThisName = obj.foo; //GlobalName(间接参考)
callThisName(); // "GlobalName"
2.参数传递中的callback function,也属於间接参考
var name = 'GlobalName';
function foo() {
console.log(this.name);
}
var obj = {
name: 'tom',
foo: foo,
};
function boo(fn) {
fn();
}
boo(obj.foo); // "GlobalName"
3.物件下的多层方法也属於间接参考
var name = 'GlobalName';
var obj = {
name: 'tom',
foo: function(){
console.log(this.name) //tom
function inner() {
console.log(this.name) //GlobalName
function inner2() {
console.log(this.name) //GlobalName
}
inner2()
}
inner()
}
};
obj.foo()
1.依序出现甚麽
function callName(){
console.log(this.name)
}
var obj = {
name:'tom',
callName:callName,
nickname:{
name:'tommy',
callName:callName
}
}
obj.callName()
obj.nickname.callName()
Ans: tom、tommy
2.依序出现甚麽
var name = "Global name"
function callName(){
console.log(this.name)
}
var obj = {
name:'tom',
callName:callName,
nickname:{
name:'tommy',
callName:callName
}
}
var newcall1 = obj.callName
var newcall2 = obj.nickname.callName
newcall1()
newcall2()
Ans: Global name、Global name(因为是间接参考)
3.依序出现甚麽
function callName(){
console.log(this.name)
}
var obj = {
name:'tom',
callName:callName,
nickname:{
name:'tommy',
callName:callName
}
}
var newcall1 = obj
var newcall2 = obj.nickname
var newcall3 = newcall1.callName() //已执行,非间接参考
var newcall4 = newcall2.callName
newcall3
newcall4
Ans:tom、[Function: callName]
4.会印出什麽呢~若是严谨模式下又会印出甚麽
// "use strict"
var name = 'tom';
function callName(){
console.log(this.name);
};
var a = {
name:'alice',
callName:callName
}
callName.name = 'jonna'
a.callName()
Ans:alice、Cannot assign to read only property 'name'
5.会依序印出什麽呢~(时常忘记!!)
var name = 'tom';
var a = {
name:'alice',
myName:function () {
console.log(this.name);
let call = () =>{
console.log(this.name);
}
call()
},
call2:() =>{
console.log(this.name);
},
call3:()=>{
name = 'wtf?'
console.log(this.name)
},
}
a.myName();
a.call2();
a.call3()
Ans: alice、alice、tom、wtf? (箭头函式作用域)
6.会依序印出什麽呢~(开始觉得恶心了....)
var name = 'tom';
var obj = {
x:{
name:'jam',
myname:function(){
console.log(this.name);
(function(){
console.log(this.name);
})();
setTimeout(function(){
console.log(this.name);
},500)
}
},
name:'alice'
}
var a = obj.x.myname();
a;
Ans:jam、tom、tom
7.依序出现什麽答案(恶心更加延伸)
var name = 'tom';
var obj = {
x:{
name:'jam',
myname:function(){
this.name = 'amy'
console.log(this.name);
(function(){
this.name = 'john'
console.log(this.name);
})();
function final(){
console.log(this.name)
};
setTimeout(function(){
this.name = 'sam'
console.log(this.name);
final()
},500);
}
},
name:'alice'
}
var a = obj.x.myname();
a;
console.log(obj.x.name)
console.log(this.name)
Ans:amy、john、amy、john、sam、john
参考资源:
竹白笔记、影片、文章、js热门面试题
<<: Ruby基本介绍(六)方法、类别、模组 && Reverse String
>>: 强制访问控制(MAC)- 安全许可(Security clearance)
工欲善其事必先利其器,来~先装个mysql(Mac电脑) 这边要先了解一个观念,mysql是由两个部...
Telegram是我们团队主要的通讯软件, 上面开了很多视窗分别通知不同的系统讯息, 每个人可以依照...
使用量身定制的品牌徽标制作工具 Visual Paradigm Online,您只需单击几下即可设计...
所有的网站大概可以分成两类:静态网页、动态网页,静态网页顾名思义就是静止的网页,不会去太频繁的更新内...
调查 查其他同业是否有案例 台积电产线中毒大当机,52亿元资安震撼教育 工业电脑大厂研华证实部分服务...