这种奇怪的行为

The strange behavior of this

本文关键字:      更新时间:2023-09-26

这里有这样的代码,我不明白为什么输出"Hello"?这个想法是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();

不,上下文不会是全局上下文,而是字符串"Hello"。 上下文是bind()函数的第二个参数,因此当调用函数"f"时

,这将是this的值。

在非严格模式下,如果作为 this 提供的值不是对象并且不是 null未定义,则会将其转换为对象。

因此,f 中的这个对象将是一个内部值为"Hello"的字符串对象,请参阅 ECMA-262 §10.4.3

如果更改:

alert( this );

到以下内容,它显示了对象的内部,因此可以判断它是什么类型的对象:

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

你会得到[对象字符串]。

相关文章:
  • 没有找到相关文章