2016-10-26 2 views
-1

Давайте посмотрим на этом примере:Смешение области применения и сами вызовов в JavaScript

var x = 3; 

var obj = { 
    x:2, 
    test: function(){ 
    var x = 1; 
    console.log(this.x); 
    } 
}; 

И тогда у нас есть различные способы для вызова этой функции:

obj.test(); // line 1 

obj.test.call(null); // line 2 

(obj.test)(); // line 3 

(obj.test = obj.test)(); // line 4 

(obj.test || obj.test)(); // line 5 

(obj.test && obj.test)(); // line 6 

(obj.test, obj.test)(); // line 7 

Я понимаю, первые 3 строки, но может кто-нибудь объяснить, меня то, что происходит дальше (строки с 4 по 7). Это сбивает с толку.

+0

Короче говоря, «это» не связан с буквальным сферы (объекта OBJ), но устанавливается динамически. Поэтому для управления контекстом и управления «этим» функции можно использовать .call (контекст, параметры) или .apply (context, parametersarray). Использование «этого», как он используется в вашем примере, не является предпочтительным и неоднозначным. Попробуйте явно ссылаться на объект. – Andries

ответ

1

От 4 до 7 в каждом случае он возвращает только функцию, а не контекст. Поэтому, когда вы захватили функцию из объекта, она теряет контекст. Затем он пытается вызвать функцию, this в ней ссылается на глобальный объект, который является окном, а x - в окне 3. Таким образом, в режиме use strict он будет нулевым, в другом режиме это будет окно.

4) Назначить правильное значение руки к левой стоимости руки и вернуть его

(obj.test = obj.test)() 

5) Если первый операнд верно, вернуть его, иначе возвращает второй операнд

obj.test || obj.test 

6) Если первый и второй операнды верны, верните первый операнд, иначе верните второй операнд

obj.test && obj.test 

7) В этом случае возвращает только второй объект. , запятую только отделяет объект друг от друга

(obj.test, obj.test)() 
+0

У этого есть чувство, но я не могу понять, почему для этой 4-строчной функции теряет свой контекст. Другие слова, почему строка 4 отличается от строки 3 – Przemek

+0

@Przemek строка 3 ничего не возвращает, но '=' оператор работает так. –

+0

JS работает так. если вы назначите функцию из объекта, она получит функцию, но не контекст. –

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

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