2016-06-22 2 views
0

this относится к объекту, которому он принадлежит, например:JavaScript «это» в функциональном блоке

var someObj = { 
    logObj : function() { return this } 
} 

obj.logObj() => someObj 

и функция является объектом. Но тогда почему this в функции относится к окну, а не к функции? Например,

function someFunc() { return this } 

не будет return someFunc(), но window.

+2

Это совершенно разные случаи. Если язык работал как ваш второй пример, тогда 'someObj.logObj' вернет ссылку на эту функцию, а не' someObj' Предлагает просто прочитать одно из многих руководств для этого в Javascript, чтобы понять, как это работает , –

+2

Владелец someFunc - это Window, потому что вы не поместили его внутри объекта. – Ryan

+0

@ Ryan, но функция - это объект. –

ответ

0

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

«Когда функция вызывается как метод объекта, объект передается функции в качестве его этого значения.» ECMAScript Specification 4.3.31

Функции не называются как методы сами по себе. Функции, которые не выполняются как методы объекта, называются методами глобального объекта (или undefined, если в «строгом» режиме).

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

 
var obj = {'test': test}; 
 

 
test(); 
 
window.test(); 
 
obj.test();

Если вы действительно хотите для this в функции, чтобы обратиться к себе, то вам придется добавить функцию как свойство само по себе, или использовать функцию, например, apply, call, или bind, которые имеют thisArg.

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

 
test.test = test; 
 

 
test.test(); 
 
test.call(test); 
 
test.apply(test); 
 
test.bind(test)();

+0

, я знаю, что это так, но мне интересно, почему. –

+0

@JaeeunLee Вы запрашиваете ссылку на спецификации? Если бы это было не так, тогда было бы невозможно «это» относиться к другим вещам. Обычно спрашивать «почему» - неправильный вопрос. – 4castle

+0

Я обновил, надеюсь, объясню почему. – 4castle

0

контекст чаще всего определяется тем, как вызывается функция. Когда функция вызывается как метод объекта, этот параметр установлен на объекте метод вызывается:

var obj = { 
    foo: function(){ 
     alert(this === obj);  
    } 
}; 

obj.foo(); // true 

Тот же принцип применим при вызове функции с новым оператором для создания экземпляра объекта , При вызове таким образом, значение этого в пределах области действия функции будет установлено на вновь созданный экземпляр:

function foo(){ 
    alert(this); 
} 

foo() // window 
new foo() // foo 

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

+0

' new foo() 'не предупреждает' foo' здесь , Он предупреждает объект с 'foo' как конструктором. Если вы хотите, чтобы он предупреждал 'foo', вам нужно было бы сделать' foo.foo = foo; foo.foo(); ' – 4castle

+0

@ 4castle Вы читаете, что я написал? «При вызове таким образом значение этого параметра в пределах функции будет установлено на вновь созданный экземпляр». Вот почему я не понимаю, почему вы добавляете свой комментарий. –

0

Существует не менее двух способов создания объекта - с объектным литералом или с конструктором объекта.

Только при использовании последней техники this обратитесь к объекту, в котором он находится.

Это, как создать объект с конструктором объекта (в вашем примере, был использован дословный):

var objConstructor = function() { 
    this.logObj = function() {return this} 
} 

var obj1 = new objConstructor() 
+0

но не мой первый пример (someObj) объектный литерал? –

+0

@JaeeunLee Посмотрите на мой ответ. Он очищает его. – 4castle

+0

Именно поэтому это не сработало. Создать с Object Literal -> это относится к окну (или ближайшему ближайшему закрытию). Создать с Object Constructor -> это относится к объекту. –

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