我正在阅读你不知道JS 的书籍,而且我正在使用 this和Object Prototypes 。
我知道this
指的是我需要查看呼叫网站的内容。呼叫站点是this
将引用的内容。我没有得到的是为什么这段代码不能正常工作(我只是写它来理解this
,而不是因为任何工作问题或任何事情)。
function foo() {
console.log(foo.hasOwnProperty('a')); // 1
console.log(window.hasOwnProperty('a')); // 2
console.log(this.a); // 3
this.a++;
console.log(window.hasOwnProperty('a')); // 4
}
function bar(){
foo.a = 42;
foo();
}
bar();
如果您查看bar
中为a
创建foo
属性的第一行,并为其指定值42.如果我评论此行,则运行console.log(foo.hasOwnProperty('a'));
让我虚假。如果我运行它,那么它返回true。但如果是这种情况,那么调用bar
确实为foo创建了一个a
属性,对吧?这导致了问题3.
我知道此时window.a
不存在。
为什么返回undefined
? this
应解析为foo.a
,对吗?因为this
的上下文会在bar
中,对吗? Bar
是呼叫网站。但是,无论undefined
是否已被注释,这仍然是foo.a = 42
。
为什么在运行true
之后会立即返回this.a++
?如何以及为什么要创建全局变量?
答案 0 :(得分:2)
注意:这只是思考Photo.new(
image: "data:image/jpeg;base64,#{image_json}",
image_file_name: 'file.jpg' # this way you can provide file_name
)
的一种简单方法。在复杂的情况下(例如使用this
或OOP时),以下内容可能不准确。
.bind()
,默认情况下,sorta指的是包含被调用函数的对象。例如,如果我做了
this
var obj = {
fxn: function() {
console.log(this.bar);
},
bar: 3
}
obj.fxn(); // (1)
var fxn = obj.fxn();
fxn(); // (2)
将“3”打印到控制台;因为在某种程度上,通过“(1)
”调用fxn
“,obj
将指向this
。换句话说,因为您正在调用存储在obj
内的fxn
副本,obj
将指向this
。
obj
将(假设(2)
未在其他地方定义)打印未定义。那是因为bar
没有被称为“通过”任何东西。因此,它假装通过fxn
调用fxn
。
虽然在您的示例中,window
在 foo
中被称为,但bar
并未调用bar
的版本...好吧,存储在自己内部。 foo
不会通过“bar
来调用foo
...”。
不可否认,这很令人困惑。也许这会消除一些困惑:如果你将foo
更改为:
bar
它将打印function bar(){
foo.a = 42;
foo.foo = foo;
foo.foo();
}
而不是未定义。重要的是,42
被调用的对象将是foo
。例如,
this
还会打印42。
答案 1 :(得分:1)
在foo this
中引用父对象 - 即窗口。
所以this.a
和window.a
指的是同一件事。
因为这个上下文会在bar中,对吗?
不正确的。酒吧"这个"在foo中你需要apply
或call
或bind
foo传递你想要的"这个"作为背景。即。
foo.call({});
or
foo.bind({});
会使"这个"和foo
中的空对象。
在运行this.a ++之后,为什么现在返回true?怎么样,为什么 正在创建一个全局变量?
出于同样的原因 - 当你这样做时.a ++你正在创建一个全局变量a
并将其递增。