回调函数中的变量范围是什么?

时间:2016-05-07 00:47:59

标签: javascript callback

getTodos(function(){
    console.log(todos)
});


function getTodos(callback) {
    setTimeout(function() {
        const todos = [{title:"Walk the dog"},{title:"Feed the cat"}];
        callback();
    },1000);
};

我认为1秒后执行的回调函数将能够看到todo const。但是翻译告诉我 todos没有定义

我在这里错过了什么吗?

要添加我从其他程序员那里学到的更多知识:“父作用域不是所谓的,而是定义的

var todos = [{title:"Curb the dog"},{title:"Tickle the cat"}]
var cb = function(){
    console.log(todos);
}
getTodos(cb);


function getTodos(callback) {
    setTimeout(function() {
        const todos = [{title:"Walk the dog"},{title:"Feed the cat"}];
        callback();
    },1000);
};

1 个答案:

答案 0 :(得分:4)

当然它是未定义的,因为

function(){
    console.log(todos)
}

超出了getTodos函数的范围。

要修复它,您可以将todos传递给回调函数:

getTodos(function(todos){
    console.log(todos)
});

function getTodos(callback) {
    setTimeout(function() {
        var todos = [{title:"Walk the dog"},{title:"Feed the cat"}];
        callback(todos);
    }, 1000);
}

Protip:const todos 表示todos中的值是常量且无法更改。

快速检查:

const list = ["Apple", "Banana"];
list[2] = "Coffee Beans";
list;                     // ["Apple", "Banana", "Coffee Beans"]

list.splice(0,1);
list;                     // ["Banana", "Coffee Beans"]

list = "something else";  // Uncaught TypeError

换句话说,todos是一个不变的参考,但可能不是你想象的那样。