В книге утверждается, что следующий код приведет к глобальному объекта:
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, его ссылка была изменена на глобальный объект при вызове. В большинстве языков программирования, предлагающих ...
'this' относится к текущему контексту. В этом коде 'this' будет ссылаться на объект' b', когда вызывается 'b.fun()'. Несмотря на то, что функция объявлена вне 'b', она вызывается из' b'. – forgivenson
bfun вызывается из var b. Поэтому он должен распечатать объект b. – Koen