2014-10-24 6 views
0

Этот код из книги Функциональная JavaScript, страница 32:Как решить «этот» объект путаницы в моем коде

var a = {name: "a", fun: function(){ console.log(this);}}; 
a.fun(); 

var bfun = function(){ console.log(this);}; 
var b = {name: "b", fun: bfun}; 
b.fun(); 

Согласно книге, b.fun() должен напечатать либо глобальный объект или что-то еще, однако, в моем случае это печать объекта b.

Является ли это опечаткой в ​​книге или я что-то пропустил?

+1

'this' относится к текущему контексту. В этом коде 'this' будет ссылаться на объект' b', когда вызывается 'b.fun()'. Несмотря на то, что функция объявлена ​​вне 'b', она вызывается из' b'. – forgivenson

+0

bfun вызывается из var b. Поэтому он должен распечатать объект b. – Koen

ответ

1

Это ошибка в книге и корректируется в errata:

В книге утверждается, что следующий код приведет к глобальному объекта:

var bFunc = function() { return this }; 
var b = {name: "b", fun: bFunc}; 
b.fun(); 
//=> some global object, probably Window 

Это неправильно. Фактически, b.fun() возвращает объект, сохраненный в переменной b. Семантика этого такова, что это задается, когда вызывается функция , а не когда функция определена. Если функция вызывается с использованием либо b.fun(), либо b'fun ', это значение равно b.

Примечание от автора или редактора: Это определенно вводит в заблуждение. Более соответствующий фрагмент кода будет:

var bObj = {name: "b", fun: function(){ return this }}; 
bObj.fun(); 
//=> {name: "b", fun: function(){ return this }} 

var bFunc = bObj.fun; 
bFunc(); 
//=> some global object, probably Window 

Объяснение текст будет читаться следующим образом:

Ну, это может быть удивительным. Вы видите, что когда функция называется в контексте объекта, ее эта ссылка указывает на объект . Однако, когда я позже связал bFunc с полем bObj.fun, его ссылка была изменена на глобальный объект при вызове. В большинстве языков программирования, предлагающих ...

+0

Спасибо за указание на ошибки. – runtimeZero

0
bfun(); // logs "Window" (or global object) 
b.fun(); // logs "b" 

Слово this всегда ссылается на объект работает функцию.

-1

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

Следующий код поможет вам:

var a = {name: "a", fun: function(){ console.log(this);}}; 
    a.fun(); 

    var bfun = function(){ console.log(this);}; 
    var b = new Function(); 
     b.name="b"; 
     b.fun=bfun; 
    b.fun();