这种奇怪的行为

时间:2015-01-08 23:06:58

标签: javascript

这里有这样的代码,我不明白为什么输出"你好"?我们的想法是g: bind (f, "Hello")应该返回一个包装函数,该函数调用函数f" Hello"的上下文。因此,this函数f应指向global object

function bind(func, context, args) {
    var bindArgs = [].slice.call(arguments, 2); // (1)

    function wrapper() { // (2)
        var args = [].slice.call(arguments);
        var unshiftArgs = bindArgs.concat(args); // (3)
        return func.apply(context, unshiftArgs); // (4)
    }

    return wrapper;
}


function f() {
    alert( this );
}

var user = {
    g: bind(f, "Hello")
}

user.g();

2 个答案:

答案 0 :(得分:4)

不,上下文不是全局上下文,它将是字符串“Hello”。上下文是bind()函数的第二个参数,因此当调用函数“f”时,它将是this的值。

答案 1 :(得分:2)

在非严格模式下,如果 this 提供的值不是对象且不是 null undefined ,则它将是转换为对象。

f 中的 将是一个内部值为“Hello”的String对象,请参阅ECMA-262 §10.4.3

如果你改变:

alert( this );

到下面,它显示了一个对象的内部,因此它可以告诉它是什么类型的对象:

alert(Object.prototype.toString.call(this) ); // [object String]

你会得到 [object String]