Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.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_Bind - Fatal编程技术网

意外的标记&引用;在JavaScript中使用.bind()时

意外的标记&引用;在JavaScript中使用.bind()时,javascript,bind,Javascript,Bind,我刚刚用.bind()尝试了一个概念验证,注意到如果我尝试在这段代码中使用.bind(),我会得到一个意外的标记“: 但是,如果我这样做: var myObj = { foo: function(){ var bar = function(){ console.log(this); }.bind(this); bar(); } } myObj.foo(); 很好。没有错误。有人能解释一下这种行为吗?我猜这

我刚刚用
.bind()
尝试了一个概念验证,注意到如果我尝试在这段代码中使用
.bind()
,我会得到一个意外的标记“:

但是,如果我这样做:

var myObj = {
    foo: function(){
        var bar = function(){
            console.log(this);
        }.bind(this);
        bar();
    }
}

myObj.foo();
很好。没有错误。有人能解释一下这种行为吗?我猜这与解析函数的时间有关,但是如果有人有更深入的解释,那就太好了

bind()
函数的一种方法。prototype
。因此,它应该在函数对象上被调用,并将返回一个新函数,该函数具有相同的主体,但与
this
绑定的值不同

当使用函数声明(您的第一个场景)时,您不会得到一个函数对象作为回报(您的第一个场景),因此会出现错误。没有可调用的
bind()

第二种方法是有效的,因为将函数赋值给变量,所以得到了一个函数对象

考虑:

function a() {
   return this.variable;
}

a(); // === undefined, because "this" is bound to the global object, 
     // and global object does not have "variable" defined.
     // When not in strict mode, global object === window (in browser env).

var b = window.a.bind({variable: 'value'});
    // Since a() was declared, it is a property of the global object (window).
    // Lets get it and bind to some object.

b(); // === 'value' - because 'b' is essentialy 'a' bound to {variable: 'value'}.

window.variable = 'other value';  // assign variable to global object
a(); // === 'other value'
b(); // === 'value' - it is not bound to global object, so no change here.
因此,在您的示例中,您可以:

var myObj = {
    foo: function(){
        function bar(){
            console.log('this', this);
        }

        var bar2 = bar.bind(this);
        bar2();

        // Or:
        // bar.bind(this)();
    }
}

第一个版本是函数声明,而第二个版本是函数值赋值。值得注意的是,它不是一个函数表达式,因为声明具有“更高的优先级”-要使它成为一个函数表达式,您应该将它赋值给变量或使用括号。谢谢,我想我得到了更多关于它为什么工作而不是为什么不工作的信息。“我想我需要更多地了解函数声明中发生的事情。”benhowdle89-当然,很高兴我帮了忙。如果您想更详细地了解函数、绑定、作用域等,我建议您只需阅读两遍左右即可:)
var myObj = {
    foo: function(){
        function bar(){
            console.log('this', this);
        }

        var bar2 = bar.bind(this);
        bar2();

        // Or:
        // bar.bind(this)();
    }
}