javascript - 为什么在回调中声明一个 var 会取消定义参数? (吊装)

标签 javascript parameters callback declaration hoisting

$(function() {
    foo1("text");
    foo2("text");
}) 

function callback(func) {
    func();
}

function foo1(bar) {
    callback(function() {
        console.log(bar);       // "text"
        bar = "derp";
        console.log(bar);       // "derp"
    })
}

function foo2(bar) {
    callback(function() {
        console.log(bar);       // undefined
        var bar = "derp";
        console.log(bar);       // "derp"
    })
}

为什么 var bar = "derp"的声明取消了预先访问的参数的定义?

最佳答案

因为这段代码

function foo2(bar) {
    callback(function() {    
       console.log(bar);       // undefined
       var bar = "derp";
       console.log(bar);       // "derp"
    })
}

实际上是

function foo2(bar) {
    callback(function() {  
       var bar;
       console.log(bar);       // undefined
       bar = "derp";
       console.log(bar);       // "derp"
    })
}

由于变量提升。因此,即使您在 foo1 调用中创建了全局 bar 变量,也会在 的内部范围内声明一个作用域变量 bar foo2 函数。这就是为什么第一个 console.log 返回 undefined

另见 Variable hoisting就这样

关于javascript - 为什么在回调中声明一个 var 会取消定义参数? (吊装),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29791771/

相关文章:

javascript - OOP JavaScript 的问题

C++:将int的地址作为参数传递

javascript - 如何在全局监听器上设置 javascript 属性,而无需重复代码

sql-server-2008 - SSIS 2008 Execute SQL输出参数映射datetime2问题

javascript - 如何使用 Javascript 将循环变量传递给事件回调函数

javascript - 如何在javascript if语句中定义变量

javascript - 重写这个 jQuery 查找选择器?

javascript - 开 Jest : Mocking files with different names

node.js - 在 Node 的 async 模块中使用函数的参数

ansible - 自定义 Ansible 回调未接收 group_vars/host_vars