Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解JavaScript中的bind()_Javascript_Ecmascript 5_Ecma - Fatal编程技术网

理解JavaScript中的bind()

理解JavaScript中的bind(),javascript,ecmascript-5,ecma,Javascript,Ecmascript 5,Ecma,根据MDN: 调用f.bind(someObject)将创建具有相同主体的新函数 和范围为f,但在原始函数中出现这种情况时 新函数它被永久绑定到bind的第一个参数, 无论函数是如何使用的: 但当我尝试下面的代码时: var模块={ x:42, getX:function(){ 归还这个.x; } } var unboundGetX=module.getX; console.log(unboundGetX());//该函数在全局范围内被调用 //预期输出:未定义 var boundGetX=u

根据MDN:

调用
f.bind(someObject)
将创建具有相同主体的新函数 和范围为
f
,但在原始函数中出现这种情况时 新函数它被永久绑定到
bind
的第一个参数, 无论函数是如何使用的:

但当我尝试下面的代码时:

var模块={
x:42,
getX:function(){
归还这个.x;
}
}
var unboundGetX=module.getX;
console.log(unboundGetX());//该函数在全局范围内被调用
//预期输出:未定义
var boundGetX=unboundGetX.bind(模块);
console.log(boundGetX());//预期产出:42
模块x=43;
boundGetY=boundGetX.bind(模块);

console.log(boundGetY());//这不应该是42吗?
我没有理解您所困惑的内容-它看起来像是按照所描述的那样工作

  • unboundGetX是对函数的引用
  • 您可以将
    module.x
    的值更改为43
  • 您可以通过调用
    unboundGetX.bind(module)
    -ie来创建一个新方法
    boundGetY
    ,即boundGetY引用的
    模块
  • 调用
    boundGetY()
    -它引用
    这个.x
    ,它是
    模块.x
    的值,43
    这里module是一个常数,但module.x不是。这就是您可以更改module.x值但无法更改module的原因


    因此,您正在更改模块的值,而不是模块本身。

    当您更改同一对象的值时,您没有绑定另一个对象,因此该值会更改

    var模块={
    x:42,
    getX:function(){
    归还这个.x;
    }
    }
    var unboundGetX=module.getX;
    console.log(unboundGetX());//该函数在全局范围内被调用
    //预期输出:未定义
    var boundGetX=unboundGetX.bind(模块);
    console.log(boundGetX());//预期产出:42
    变量模块2={
    x:43,
    getX:function(){
    归还这个.x;
    }
    }
    boundGetY=boundGetX.bind(模块);
    
    log(boundGetY())模块后的code>x=43行运行时,
    module.x
    是43,而不是42,所以您看到43了吗?在这一点之后,内存中的任何地方都没有42,为什么您希望看到42?@CertainPerformance,因为他们说
    bind()
    是永久的,并且在第一个参数传递给它时只工作一次?不,它不只工作一次,您可以继续调用绑定函数任意多次,而且
    .bind
    不会深度克隆新的
    这个
    或类似的东西
    
    function f() {
      return this.a;
    }
    
    var g = f.bind({a: 'azerty'});
    console.log(g()); // azerty
    
    var h = g.bind({a: 'yoo'}); // bind only works once!
    console.log(h()); // azerty
    
    var o = {a: 37, f: f, g: g, h: h};
    console.log(o.a, o.f(), o.g(), o.h()); // 37, 37, azerty, azerty