这篇文章给大家分享的是有关ECMA Javascript中这有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
这实际上是在函数被调用时发生的绑定,它指向什么完全取决于函数的调用位置(也就是函数的调用方法)。
<强>四条规则:(你不知道的JS) 强>
<强> 1。默认绑定强>
函数foo () { 控制台。日志(这。一个); } var=2; foo ();//2
无论是否在严格模式下,在全局执行上下文中(在任何函数体外部)这都指代全局对象。(MDN)
在严格模式下,这将保持他进入执行上下文时的值,如果这没有被执行上下文(执行上下文)定义,那它将保持为定义。(MDN)
函数foo () { “使用strict"; 控制台。日志(这。一个); } var=2; foo ();//TypeError:这是未定义的
2。隐式绑定/丢失
当函数作为对象里的方法被调用时,它们的这是调用该函数的对象,且绑定只受最靠近的成员引用的影响。(MDN)
//隐式绑定 函数foo () { 控制台。日志(这。一个); } var methoda={ 答:42岁 foo: foo }; var其中obj1={ 2, methoda: methoda }; obj1.obj2.foo ();//42
//隐式丢失 函数foo () { 控制台。日志(这。一个); } 函数doFoo (fn) {//fn其实引用的是foo fn ();//& lt;——调用位置! } var obj={ 2, foo: foo }; var=?哦,global";//一个是全局对象的属性 doFoo (obj。foo);//鞍パ?global"
3。显示绑定
如果要想把它的值从一个上下文传到另一个,就要用电话或者应用方法。(MDN)
调用f.bind (someObject)会创建一个与f具有相同函数体和作用域的函数,但是在这个新函数中,这将永久地被绑定到了绑定的第一个参数,无论这个函数是如何被调用的。
var obj={ 数:0, 酷:函数coolFn () { 如果这一点。数& lt;1){ setTimeout(函数计时器(){ this.count + +;//这是安全的//因为绑定(. .) 控制台。日志(“更awesome"); }。bind (), 100);//看,bind () ! } } }; obj.cool ();//更酷了。
硬绑定
创建一个包裹函数,传入所有的参数并返回接收到的所有值。
硬绑定会大大降低函数的灵活性,使用硬绑定之后就无法使用隐式绑定或者显式绑定来修改。
//简单的辅助绑定函数 函数bind (fn、obj) { 返回函数(){ 返回fn。应用(obj,参数); }; }
软绑定
给默认绑定指定一个全局对象和未定义以外的值,那就可以实现和硬绑定相同的效果,同时保留隐式绑定或者显式绑定修改这个的能力。
Function.prototype。softBind=函数(obj) { var fn=; var咖喱=[].slice。调用(参数,1);//捕获所有咖喱参数 var约束=function () { 返回fn.apply ( (!这| |===(窗口| |全球))?obj:这 curried.concat。应用(咖喱,参数) ); }; 绑定。原型=对象。创建(fn。原型); 返回绑定; };
4。新绑定
当一个函数用作构造函数时(使用新关键字),它的这个被绑定到正在构造的新对象。(MDN)
使用新的来调用函数,或者说发生构造函数调用时,会自动执行下面的操作(你不知道的JS)
- <李>
创建(或者说构造)一个全新的对象。
李> <李>这个新对象会被执行[[原型]]连接。
李> <李>这个新对象会绑定到函数调用的。
李> <李>如果函数没有返回其他对象,那么新表达式中的函数调用会自动返回这个新对象。
李>函数foo () { 这一点。一个=; } var酒吧=new foo (2); 控制台。日志(酒吧。一个);//2
<强>四条规则优先级强>
新绑定比;,显式绑定比;隐式绑定比;默认绑定
- <李>
函数是否在新中调用(新绑定)?如果是的话这绑定的是新创建的对象。
var酒吧=new foo ()李> <李>
函数是否通过电话,申请(显式绑定)或者硬绑定调用?如果是的话,这绑定的是指定的对象。
<强>另外:>强如果绑定null或者定义,实际应用的是默认绑定规则。