代码之家  ›  专栏  ›  技术社区  ›  Daniel K.

绑定带有null或未定义为thisArg的javascript函数

  •  2
  • Daniel K.  · 技术社区  · 8 年前

    当我执行以下javascript代码片段时。。。

    function addAndThis(n1, n2) {
      console.log("THIS:" + this + " SUM:" + (n1+n2));
    }
    
    var boundNullThisAddAndThis = addAndThis.bind(null);
    var boundUndefinedThisddAndThis = addAndThis.bind(undefined);
    var boundStringThisAddAndThis = addAndThis.bind("TEST");
    
    addAndThis(10, 20);
    boundNullThisAddAndThis(100, 200);
    boundUndefinedThisddAndThis(1000, 2000);
    boundStringThisAddAndThis(10000, 20000);
    

    …我得到这个输出:

    THIS:[object Window] SUM:30
    THIS:[object Window] SUM:300
    THIS:[object Window] SUM:3000
    THIS:TEST SUM:30000
    

    输出的第一行和最后一行与我预期的一样。但为什么由 功能.原型.bind 不调用this为null或未定义的包装函数?我在网上找不到关于这种行为的任何信息。

    1 回复  |  直到 8 年前
        1
  •  3
  •   Whothehellisthat    8 年前

    尝试使用非对象作为上下文很可能会出现问题。尝试使用基元( fn.call(1) )实际上“装箱”值,将原语转换为用作上下文的对象。

    这个 .call() .apply() .bind() 函数都采用“nully”值,并使用默认值 window

    正如其他人所指出的(也在MDN页面上),严格模式下不会发生这种情况。奇怪的是,虽然大多数时间严格的模式会给你戴上手套,但在这种情况下,它会相信你知道自己在做什么;P

    [ MDN ]