Javascript中的详细解决方案
Javascript中的这一点总是让人困惑。它应该是JS的一个众所周知的坑,个人也认为js中的这个不是一个好的设计,而且由于这个后期绑定的属性,它可以是一个全局对象,当前对象,或者……有些人甚至不用它们,因为它们很大。
事实上,如果您完全掌握了这一工作原理,它自然不会进入这些坑:
1。这在全局代码中
警戒(此)
窗口
全局将指向全局对象,甚至在浏览器中,甚至窗口。
2。作为一个简单函数调用
功能foocoder(x){
这个;
}
(2)foocoder;
警报(x);
全局变量x值为2。
这里指向全局对象,即窗口,在严格的模式下,它是未定义的。
三.方法作为对象调用
聪明的编码器;
var
名称:foocoder
你好:函数(某物){
console.log(this.name + 某事);
}
}
person.hello(Hello World);
输出foocoder说你好世界。这一点对人的对象,当前对象。
4。作为一个构造函数
新的foocoder();
函数中的这个点指向新创建的对象。
5。内部功能
聪明的编码器;
var
名称:foocoder
你好:函数(某物){
VaR方法sayHello =功能(某物){
console.log(this.name + 某事);
};
Sayhello(某物);
}
}
person.hello(Hello World);
聪明的程序员说你好世界
在内部函数,这不绑定到外部函数对象的预期,但必然是全局对象,这通常被认为是Javascript语言中的一个设计错误,因为没有人希望在内部功能指向全局对象。处理的一般方法是挽救这个一个变量,一般同意,或自:
聪明的编码器;
var
名称:foocoder
你好:函数(某物){
var =;
VaR方法sayHello =功能(某物){
console.log(that.name + 某事);
};
Sayhello(某物);
}
}
person.hello(Hello World);
/ / foocoder说你好世界
6。使用调用并应用设置
person.hello.call(人,世界);
应用程序类似于调用,但是以下参数是通过数组传递的,而不是单独的:
电话(thisarg {,arg1,arg2,…});
/ /参数列表,arg1,arg2,…
申请(thisarg {,argarray });
/ /参数数组,argarray
两者都用于将函数绑定到一个特定的对象,当然这将在此时显式地设置为第一个参数。
Simply summing up
对以上几点的简要总结可以发现,事实上只有第六分是令人费解的。
事实上,它可以概括为以下几点:
1。当函数被称为对象的方法调用时,这指向对象。
2。当函数被称为淡入函数调用时,这指向全局对象(当严格模式未定义时)
这在3。构造函数指向新创建的对象。
这在4。嵌套函数不继承上面函数的这个函数,如果需要,可以使用一个变量保存上面函数的这个函数。
摘要的简单之处在于,如果在函数中使用了该函数,则只有当对象直接调用函数时,才会指向对象。
Obj.foocoder();
foocoder.call(obj,…);
foocoder.apply(obj,…);
更进一步
我们可能经常写这样的代码:
$(#some-ele).Click = obj.handler;
如果这是用于处理程序,这将必然目标显然不是,转让后,该函数在回调执行,这势必对美元(#一些div)元。这就需要一个函数的执行环境的理解。本文不打算延长该函数的执行环境,可以参考的执行环境和在Javascript高级程序链的介绍。需要指出的是,它对JS函数的执行环境的了解将更好地了解这。
那么我们如何解决回调函数绑定的问题呢介绍了一种新的方法在ES5,绑定():
Fun.bind(thisarg { { {,arg1,arg2,} } }…)
thisarg
调用绑定函数时,参数被指定为原始函数运行时的这个参数。当使用新操作符调用绑定函数时,参数无效。
arg1,arg2,…
当调用绑定函数时,这些参数,加上绑定函数本身的参数,在原始函数时被用作参数。
此方法创建一个新的功能叫做绑定功能,结合功能的绑定方法的第一个参数是创造了它,并在第二次传递的参数绑定的方法与参数绑定功能操作本身按照顺序为原函数的参数来调用原函数。
显然,绑定方法可以很好地解决上述问题。
$(#一些元素),Click(person.hello.bind(人));
/ /对应的元素被点击时,输出foocoder说你好世界
事实上,这种方法也很容易模拟,我们看看Bind方法的源代码在Prototype.js:
function.prototype.bind =函数(){
var fn =,= array.prototype.slice.call args(参数),对象为args.shift();
返回函数(){
返回fn.apply(对象,
Args.concat(array.prototype.slice.call(参数)));
};
};
我相信全文后,这不再是一个坑,大家都明白,想知道更多的网站学习点击。