2016-07-21 9 views
1

Когда я выполнить следующий фрагмент кода яваскрипта ...Связывание яваскрипта функции с нулевым или не определено, как thisArg

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 

первая и последняя строки выхода, как я и ожидал. Но почему связанная функция, созданная Function.prototype.bind, не вызывает завернутую функцию с нулевым или неопределенным? Я не нашел ничего такого поведения в сети.

+1

Когда вы добавляете «use strict»; в начале функции он ведет себя так, как ожидалось, поэтому, возможно, null/undefined переводятся в окно по умолчанию, если не работает строгий режим? – sielakos

+0

Да, если вы привязываетесь к null или undefined, это означает глобальный контекст. – cstuncsik

ответ

2

Это, скорее всего, проблема с попыткой использовать не объект в качестве контекста. Пытаясь использовать примитив (fn.call(1)), фактически «помещает» значение, превращая примитив в объект для использования в качестве контекста.

The .call().apply() и .bind() функции все берут "nully" значения и использует объект по умолчанию window вместо этого.

Как указывали другие (а также на странице MDN), этого не происходит в строгом режиме. Как ни странно, в то время как в большинстве случаев строгий режим накладывает на вас детские перчатки, в этом случае он верит, что вы знаете, что делаете! ; P

+0

Как указывали другие (а также на странице MDN) это не происходит в строгом режиме. Как ни странно, в то время как в большинстве случаев строгий режим накладывает на вас детские перчатки, в этом случае он верит, что вы знаете, что делаете! ;П – Whothehellisthat

 Смежные вопросы

  • Нет связанных вопросов^_^