2013-07-09 3 views
2

Может кто-то объясняет область связывания следующего кода, пожалуйстаJavascript вложенная функция потери сфера

window.name = "window"; 

object = { 
     name: "object", 
     method: function() { 
      nestedMethod: function() { 
        console.log(this.name); 
      } 
      nestedMethod(); 
     } 
} 

object.method(); // print 'window' 

Я думаю, что мой вопрос больше о this ... почему this потери объема и по умолчанию в глобальном масштабе? все анонимные функции, которые мы создали, пойдут на глобальную сферу?

+0

Вы можете попробовать использовать имя объекта, поэтому 'object.name'. – elclanrs

+1

нет. все функции идут по глобальной области по умолчанию, если не привязаны к объекту как свойству ... – dandavis

+2

@ dandavis, что действительно неточно. Функции не по своей сути «продолжают» любую область. Значение 'this' определяется обстоятельствами каждого вызова функции. – Pointy

ответ

1
window.name = "window"; 

object = { 
    name: "object", 
    method: function() { 
     var self = this; 
     var nestedMethod = function() { 
      console.log(self.name); // or object.name without declaring self 
     } 
     nestedMethod(); 
    } 
} 

object.method(); // print 'object' 

Сохраните область действия объекта или используйте сам объект!

все анонимные функции, которые мы создали, будут отображаться в глобальном масштабе?

Нет, не все анонимные функции теряют объем, все функции области видимости связаны с глобальным объектом (если они не вызываются с конкретными this, см apply и call, смотрите пример ниже)!

window.name = "window"; 

object = { 
    name: "object", 
    method: function() { 
     var nestedMethod = function() { 
      console.log(this.name); 
     } 
     nestedMethod.call(this); //change the this arg in the current object scope 
     // when you call this function with .call(this) you are changing the value of the nestedMethod's this to the current this, which is object 
    } 
} 

object.method(); // print 'object' 
+1

Что вы подразумеваете, что все функции привязаны к глобальному объекту? вы говорите, что я могу напрямую вызвать nestedMethod в глобальной области? – peter

+0

FYI, ссылаясь на 'this' как * scope *, неверно (по крайней мере, мне кажется, что вы это делаете). –

+0

_ «все функции привязаны к глобальному объекту» _ - Я думаю, что это немного неточно. Функции, в которых 'this' не привязаны, будут выполняться в контексте окна, но область действия все равно будет самой близкой функцией. – elclanrs

2

Любая функция, которая вызывается следующим образом:

someFunction(); 

будет иметь глобальный охват в качестве значения this (в нестрогом режиме). Вы можете копить внешнюю сферу в локальной переменной, либо использовать .call() или .apply():

nestedMethod.call(this); 
+0

Вы имеете в виду любую вызванную функцию независимо от того, какой масштаб он называет и где он определяется? – peter

+0

@ пользователь1389813 да, это правильно. Любая функция, которая просто вызывается (не с '.call()' или '.apply()', а не с 'new', а не с помощью ссылки на свойство объекта, например' foo.myFunc() '), приведет к значению 'this' является объектом' window' (global) в нестрогом режиме и 'undefined' в строгом режиме. – Pointy

3

Всякий раз, когда вы вызываете функцию, просто написав func(), this внутри функции будет указывать на глобальный объект. В вашем случае вы пишите:

nestedMethod(); 

Так this внутри nestedMethod является объектом окна. Вы можете использовать call (или apply), чтобы вручную определить контекст для вас и вызова функции:

nestedMethod.call(this); 
Смежные вопросы