1、这两个代码的this指向让我懵逼了
2.1、
var length = 10;
function fn() {
console.log(this.length);
}
var obj = {
a: fn,
length: 5,
method: function (f) {
//console.log(this===obj);//true
f();
//console.log(arguments)
//arguments[0]();//
//arguments[0].call(this);//
//arguments[0].call(obj);//
}
};
obj.method(obj.a);
2.2、
var name = 'out';
var obj = {
name: 'in',
prop: {
name: 'inside',
getName: function () {
return this.name;
}
}
};
//console.log(obj.prop.getName());//
var test = obj.prop.getName;//
console.log(test());//
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
this 绑定的是当前对象,必须是直接调用。
非严格模式下
严格模式下
所以:
只要看最后是谁调用就行了
1.obj.method(obj.a)//这时obj.a和obj.a()是不一样的,obj.a是取这个属性的引用,而不是调用
等价于 obj.method(function(){})//所以执行的时候就是直接执行函数而,this指向全局或者undefined
2.一样的道理obj.prop.getName是取属性值的引用,obj.prop.getName()这样才是调用,所以这时候this还是指向全局或者undefined
1.
this指向不看定义的时候在哪,而是看调用的时候指向。obj.method(obj.a)。那么调用的就是obj,而obj在全局作用域里面,所以this指向window或undefined(严格模式)。2.调用的是
test。test在全局作用域,所以name也是全局下的name。如果一定要修改这个指向,可以在这行:再调用的时候就是in或者inside了
上面的大哥回答的很好了,我稍作一点补充
问题1,2实际是一个道理,咱们三段论的方式来看一下这个问题
var a = function(){console.log(this)};当调用a()时,this指向的window,因为a()与window.a()等价承上
var obj = {method: a};'与var obj = {};obj.method = a`等价承上
obj.method与window.obj.method等价,则调用obj.method()时this指向window.obj承上
其中
题目二你可以尝试自己分析一下,如果有哪里说得不对也欢迎大家指出。