意外的标记&引用;在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)();
}
}