какая разница между браузерами и узлами? - PullRequest
6 голосов
/ 24 декабря 2011

в чем разница между браузерами и узлами?например:

setName.js на узле:

var setName;
setName = function (name) {
    return this.name = name;
};
setName("LuLu");
//LuLu
console.log(name);
//undefined
console.log(this.name);

setName.html в браузере:

<script>
    var setName;
    setName = function (name) {
        return this.name = name;
    };
    setName("LuLu");
    //LuLu
    console.log(name);
    //LuLu
    console.log(this.name);
</script>

второй журнал отличается, почему?

Ответы [ 2 ]

8 голосов
/ 24 декабря 2011

Узел - это движок JavaScript, а не браузер. Конкретная причина, по которой вы видите undefined в узле и Lulu в браузере? Различия в глобальном пространстве имен :

В браузерах область верхнего уровня - это глобальная область. Это означает, что в браузерах, если вы находитесь в глобальной области видимости, var something будет определять глобальную переменную. В Node все по-другому. Область верхнего уровня не является глобальной областью; var something внутри модуля Node будет локальным для этого модуля.

В браузере this является ссылкой на объект window - глобальное пространство имен браузера - для всех функций, которые вызываются не привязанными к объекту (например, , а не , как foo.bar()). В Node this просто не является ссылкой на глобальное пространство имен.


N.B. console.log(this.name) в интерпретаторе Node напечатает Lulu, а не undefined. Это потому, что только в REPL,

> this === global
true

Дальнейшее чтение @ Как Узлу: Что такое "это?"


Хорошо, еще одно редактирование в соответствии с комментарием @ Šime Vidas * относительно this в ES5 строгом режиме :

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

Более интересное чтение любезно предоставлено Юрий Зайцев (он же @kangax) в одном из его постов в блоге .

2 голосов
/ 24 декабря 2011

Ваш код браузера содержит хост-объект window.Узел не имеет этого хост-объекта.Когда вы устанавливаете this.name, вы фактически устанавливаете его для объекта window, что делает переменную global .

window.name === this.name // true

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...