var len = 5;
var fn1 = function () {
console.log(this.len);
};
var main = {
method: function (fn) {
fn();
arguments[0]();
},
len : 10
};
main.method(fn1);
var len = 5;
var fn1 = function () {
console.log(this.len);
};
var main = {
method: function (fn) {
fn();
arguments[0]();
},
len : 10
};
main.method(fn1);
关于 this 的指向问题,前 fn()
是直接运行的函数,内部 this 应该指向 window。
让我疑惑的是
arguments[0](); // 'underfined'
后来想明白了,arguments
是一个对象,且 arguments[0] = fn
,故执行的时候,this 指向 arguments
,但 arguments
的 len 为 underfined
。
fn() 弹出5, 没有调用者,属于直接执行
arguments[0]() 弹出 undefined,调用者为 arguments,弹出 arguments.len = undefined
如果需要10,那么应该这么写:
var len = 5;
var fn1 = function () {
console.log(this.len);
};
var main = {
method: function (fn) {
fn.call(this,arguments);
},
len : 10
};
main.method(fn1);
很多框架或者插件都应该能看到这种写法。
那么写和直接执行没啥区别。
var len = 5;
var fn1 = function () {
console.log(this.len);
};
var main = {
method: function () {
fn1()
},
len : 10
};
main.method(fn1);
10 回答11.2k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
这哪是作用域问题呀,这是
this
指向的问题。因为
fn
的调用是fn()
所以里面的this
是window
,所以输出是winodw.len
是5