gpt4 book ai didi

javascript - 为什么这个函数记录未定义(JavaScript 闭包)

转载 作者:行者123 更新时间:2023-11-30 16:42:01 24 4
gpt4 key购买 nike

想知道为什么 init 函数最终会记录未定义的日志,因为 startDate 是在调用 logStartDate 之前定义的。
代码:

var startDate;

var init = function(startDate) {
this.startDate = startDate;
logStartDate();
};

var logStartDate = function() {
console.log(startDate);
};

init('2015-01-02');

最佳答案

您的代码可能无法正常工作,因为 this 的值不是您期望的值,因此 this.startDate 不会更改变量 startDate 您的代码中有,因此该变量从未被初始化。

您在该引用中滥用了 this,因此这是开始修复您的代码的地方。事实上,如果您在 strict 模式下运行代码,您的代码会产生错误,因为 this 将是 undefinedstrict 模式明确设计用于防止糟糕的编码实践,例如意外地以错误的方式使用 this

Why is this.startDate a poor construction, what's a better construction?

this 用于引用方法调用中的对象,如 obj.method() 中。在 method 内部,this 将引用 obj 或者 this 可以在调用者的其他一些情况下使用函数的 显式导致 this 的值被设置为一个有意义的值。在正常的函数调用中,this 将是全局对象,或者在严格模式下将是 undefined,通常不应使用。参见 this answer this 的值在哪些情况下被设置为唯一值的列表。

在调用者未明确设置 this 的普通函数调用中,您根本不应该使用 this。事实上,如果您在严格模式下运行代码(强烈推荐),this 的值在您的 init 函数中将是 undefined .

如果您只是想将名为 startDate 的更高级别范围的变量设置为传递给 init 的值,那么您应该将参数名称更改为init 函数设置为一个不冲突的名称,然后直接引用 startDate 变量,如下所示:

var startDate;

var init = function(initialDate) {
startDate = initialDate;
logStartDate();
};

var logStartDate = function() {
console.log(startDate);
};

init('2015-01-02');

Isn't a function expression a closure?

闭包仅在某些情况下创建,当函数内部的某种内部引用是持久的,它在函数完成执行后保持函数的作用域。所有函数表达式都不是闭包。您在此代码中没有闭包。参见 How do JavaScript closures work?更多关于闭包的讨论。

关于javascript - 为什么这个函数记录未定义(JavaScript 闭包),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31813334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com