.bind()不适用于函数

时间:2014-07-27 21:37:56

标签: javascript

我试图使用置于函数内的变量。我不打算对这段代码做任何特别的事情,但我想弄清楚为什么绑定/应用/调用对象而不是函数。

function another () {
    this.var = 'another test'
}

function test (){
    this.var = 'test123'
    console.log('this.first: ',this.var);
}

var bind = test.bind(another);
console.log('bind: ', bind());

2 个答案:

答案 0 :(得分:3)

.bind()适用于各种功能。它只是不按照你的想法做到。

看,函数也是对象。将它们视为对象并不意味着它们会被调用。

function a() { console.log("a was called"); }
function b() { console.log(this); }

var bound = b.bind(a);
bound();  // logs "function a() { }" in my console

在您的情况下,一旦您将test绑定到another,就会有一个新功能,就像test一样,但this表示{{1}因此another表示this.var。所有这一切都发生在没有another.var 被称为的情况下。

我不完全确定你的代码是如何工作的,因为它没有多大意义。但如果你在运行之后检查一下,你会发现another现在的值为another.var

即使你事先说过'test123',也没关系。首先,因为another()没有绑定任何东西,所以another表示全局对象。在浏览器中,this基本上只是设置another()。但其次,window.var设置了自己的值 - 所以即使两个函数对test的含义有相同的概念,this.var也会用test覆盖它。

答案 1 :(得分:1)

这将记录“另一个测试”,因为this默认为window

function another() {
    this.foo = 'another test';
}

another();

console.log(window.foo);

编辑:

// define function object window.first:
function first() {
    this.foo = 'first';
}

// define function object window.second:
function second() {
    this.foo = 'second';
}

// call window.first, sets window.foo to 'first':
first();

// set window.bound to a new function object which
// runs second in the context of the object first:
var bound = second.bind(first);

// call window.bound, which sets window.first.foo to 'second':
bound();

// call second, which sets window.foo to 'second' then logs the return
// value of second, which is undefined:
console.log('second: ', second());