2014-09-08 2 views
4
var abc=(function(){ 

    var self=this; 

    return { 
     self:self 
    }    


})(); 

При выполнении я получаю undefined, что делает this случиться, что в этом контексте.Что «это» означает в этом откровенном шаблон модуля

+0

'abc.self' прекрасно работает для меня, и' this' является глобальным масштабом, как IIFE не имеют специальный scope- – adeneo

+1

Когда я делаю 'abc.self', я получаю объект' window'. – Barmar

ответ

4

То, что вы можете быть упрощены с целью объяснения в

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

Ваше выражение (в первом наборе скобок) определяет функцию. Затем вы вызываете эту функцию без контекста (this). Эта конструкция называется IIFE. Как вы не сдадите контекст, поведение зависит от того, что называется в strict mode или нет:

  • В не строгом режиме будет иметь глобальный объект (window в браузере, global в узле).

  • В строгом режиме недостающий контекст вызова функции не заменен, это undefined.

Как вы undefined, я думаю, вы в strict mode. Вероятно, у вас есть "use strict"; в начале файла или в закрывающей функции.

Если вы хотите, чтобы передать контекст, вы можете, например, сделали

(function(){ console.log(this) }).call(someobject); 
+0

Да, я был в строгом режиме. Но я не смог понять статут. «В строгом режиме недостающий контекст вызова функции не заменяется». –

+0

@Sureshkumar Я отредактировал. Теперь понятно? –

+0

Да, благодарность дистрофии –

1

this относится к текущему объекту. В вашем состоянии this будет window, и, как вы пытаетесь получить значение , вам нужно использовать так:

this.self = this; 

Теперь только вы можете получить значение:

var xyz = new abc(); 
xyz.self 

Но обратите внимание, что вы не можете использовать abc как конструктор, такой как приведенный выше код, потому что вы используете закрытие.

1

в том, что "корень сферы" this является window

и

console.log(abc.self); 

результаты для меня в

Window {top: Window, window: Window, ...}