это.глобалвар против о.глобалвар - PullRequest
0 голосов
/ 21 февраля 2012

Я недавно где-то читал (мне очень жаль, что я не могу предоставить источник), что вы можете использовать this.varname для доступа к глобальным переменным вместо window.varname, чтобы сохранить 2 символа

var myVar = "global";
function myFunc() {
    var myVar = "notGlobal";
    alert( this.myVar ); //global
}

Этокажется, работает, но я хочу знать, если:

  • безопасно использовать в старых браузерах
  • это кросс-браузер совместимо
  • это не удастся принекоторые странные обстоятельства

Ответы [ 3 ]

2 голосов
/ 21 февраля 2012

Это не будет работать в современных браузерах, если кто-то ударит «использовать строгий» над вашим кодом, так как this будет undefined внутри функции.

<script type="text/javascript">
"use strict";


...


function test(){
console.log(this);
}

test(); // undefined
</script>

Обратите внимание, что вы можете сохранить гораздо больше символовпросто присваивая window некоторой переменной в верхней части вашего кода и используя ее, так как она будет сокращена до какой-то одной символьной переменной минимизатором.

(function(global){
    global.foo();
    global.bar();
})(window);

будет сведено к минимуму (без пробелов):

(function(a){
    a.foo();
    a.bar();
})(window);

Где this не будет затронуто, поскольку это ключевое слово.

2 голосов
/ 21 февраля 2012

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

В нестрогом коде:

Так в глобальной области видимости:

console.log(this === window); // true if not in strict mode

И аналогично, если у вас есть функция, которую вы вызываете напрямую:

function foo() {
   console.log(this === window);
}

foo(); // Logs "true"

Но , в JavaScript this полностью определяется тем, как вызывается функция.Таким образом, мы могли бы вызвать foo, установив this в другое значение:

var obj = {};
foo.call(obj); // Now it logs "false", `this` === `obj` during the call

Аналогично:

var obj = {};
obj.f = foo;
obj.f(); // Also logs "false", `this` === `obj` during the call

Итак, в заключение, в глобальной области (не в вызове какой-либо функции),да, this надежно указывает на глобальный объект, и если вы контролируете, как вызывается функция, и вызываете ее, не устанавливая this для чего-либо еще (через call или apply, или используя его изсвойство объекта a'la obj.f выше), то, опять же, оно будет надежно ссылаться на глобальный объект.Это охватывается разделами 10.4.1 (Ввод глобального кода) и 10.4.3 (Ввод кода функции) спецификации.Я верю, что так было с самого начала;безусловно, в течение последних 15 лет, поэтому вы вряд ли найдете несоответствующую среду.

Дополнительные материалы:

1 голос
/ 21 февраля 2012

this всегда имеет значение.И если this не был каким-то образом переопределен, то это будет window, где находятся все ваши глобальные переменные.

Это будет работать во всех реализациях JS, но будьте осторожны!Это более хрупко, и это не всегда будет указывать на глобальную переменную.

Например:

var myVar = "global";
var obj = {
  myVar: "property",
  fn: function() { return this.myVar; }
}

console.log(obj.fn()); // "property"

Это терпит неудачу, потому что в этом контексте this является этим объектом.Но при выполнении функции, которая НЕ является свойством объекта, this по умолчанию будет использовать окно, как в вашем примере.

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