2016-05-20 3 views
1

Итак, я пытался немного узнать о контексте JS и понять «это» ключевое слово. Это код, с которым я работал:Явное «это» связывание: как работает метод .bind?

var addNumbers = function(num1, num2){ 
    console.log(num1+num2); 
} 

var newAdd = addNumbers.bind(this,1,2); 

newAdd(); 

Приведенное выше значение 3, как и должно быть. Но если я называю addNumbers.bind без "этого" ключевого слова:

var newAdd = addNumbers.bind(1,2); 

Вызов newAdd() возвращает NaN. Почему это NaN происходит? и также, я только наткнулся на решение добавить «это» в качестве первого параметра, пытаясь разобраться и не обязательно из интуиции. Почему передача «это» в качестве параметра работает? и какой контекст представляет собой «это» в этом случае? Благодарю.

EDIT: Этот вопрос отличается от любых связанных вопросов .bind(), потому что он не просит общего объяснения этой функции. Я спрашиваю о конкретном случае использования и нуждаюсь в конкретном ответе. Другие предлагаемые дубликаты были более обобщенными и более открытыми для разных типов ответов.

+0

@EngineerDollery добавил объяснение, почему это не так. Ответ, который я ищу, более конкретный, и речь идет об определенном аспекте .bind(), в отличие от общего объяснения .bind() –

+0

. Я не хочу удалять мое закрытое голосование на этой основе, извините , Я думаю, что ссылочный Q тоже отвечает на этот вопрос - и довольно четко. Я думаю, что это дубликат более чем того вопроса, но я могу голосовать только за один дубликат. Ответы, которые вы все говорите, заменяют первый аргумент 'this', это то же самое, что вы узнаете, прочитав связанный обман. –

ответ

3

.bind используется для назначения «этот» контекст другого объекта

В вашем случае, .bind(1,2) назначен " это», как 1 и параметры num1=2, num2=undefined, и 2 + неопределенная является NaN в JS

Если у вас есть функция в объекте, скажу obj.func(asd), this будет obj в функции func. Если вы хотите изменить контекст this, вы можете использовать bind или apply (это как bind, но он вызывает функцию непосредственно, вместо того, чтобы создавать новую)

+0

Ничего себе, это было! Спасибо за ваш ответ. Именно то, что я искал. –

0

Проще говоря, потому что Function#bind function всегда принимают this контекста функции в качестве первого аргумента:

fun.bind (thisArg [, arg1 [arg2, [...]]])

в вашем примере, вы передаете 1 в качестве значения this (который не является инвалидом, но, вероятно, не то, что вы пытаетесь сделать):

var newAdd = addNumbers.bind(1,2); 

Так что, если вам не нужен this аргумент, вы могли бы просто передать null:

var newAdd = addNumbers.bind(null, 1, 2); 
Смежные вопросы