2013-03-24 2 views
0

Я учусь Javascript и хочу проверить следующий код:JavaScript: переменная функция в обзорности

var name1 = "global"; 

function userobject(){ 
    this.name1 = "local"; 
} 
function func() { 
    alert(name1); 
} 

var myobject=new userobject(); 
func(); 
func.call(myobject); 

В моем понимании, в первом вызове Func, должна быть вызвана тревога («глобальная»), но при втором вызове func.call (myobject) необходимо вызвать предупреждение («local»),

, но на самом деле в обоих случаях отображается «глобальный» текст. Я думал, что при выполнении, когда интерпретатор видит имя переменной, он пытается идентифицировать его в нем локально, и если он не может найти его там, он будет искать его в родительском. В моем случае я думал, что из-за func.call (myobject) родительский объект myobject, и функция должна использовать переменную name1, которая определяется как «локальная».

Пожалуйста, правильно, где я ошибаюсь в понимании этого?

+1

'this.name1' не является локальной переменной, а является * свойством * myobject'. Вы не можете получить к нему доступ, как переменную. – Bergi

ответ

2

Когда интерпретатор не может найти name1 в области видимости, он начинает искать его во внешней области и, в конечном итоге, в глобальное пространство имен, если его не найти. Нет никаких неявных ссылок на this, поэтому name1 всегда является глобальной переменной и никогда не имеет локальных свойств объекта. Если бы вы явно получить доступ к собственности, то ваш код будет работать, как ожидалось:

function func() { 
    alert(this.name1); 
} 

Вашего call метод делает поставил this в сфере, но это не меняет того, что локальные переменные ссылаются. У вас может быть переменная с тем же именем свойства глобального объекта, но они не будут одинаковыми.

+0

Если я прав, когда вызывается функция, интерпретатор создает объект активации и помещает в качестве свойств для этого объекта локальные переменные и аргументы функции. И вот в чем суть, не так ли? если просто вызывать func(), то это означает, что глобальная область определяется объектом окна. Я думал, что, вызывая функцию, используя func.call, этот объект изменяется на myobject. – maximus

+0

@maximus Нет, локальные переменные функции не являются свойствами объекта. И область действия определяется только функцией. Если есть функция, эта функция имеет область действия. – 0x499602D2

+0

Получил, спасибо :) – maximus

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