在Javascript中跨不同作用域访问变量


var todoList = {
todos: []

displayTodos: function () {
console.log(this.todos[i].todoText);
}
addTodo: function (todoText) {
this.todos.push({todoText: todoText});
}
}

这不是完整的程序,但我的问题是:

在displayTodos函数中,如何访问todoText(在控制台日志行中)?

在addToDo函数中声明的todoText变量的作用域难道不应该限制为声明它的函数addToDo吗?

感谢

这与函数的*上下文*有关。不是范围,而是上下文

范围:

这与函数可见的变量有关。

函数可以访问其局部变量(在其定义的主体中声明,包括作为局部变量添加的任何参数)调用的封闭范围中的任何变量。

上下文(适用于OP问题):

函数的调用方式有关,或者与函数在被调用时被分配给的对象有关。更具体地说,它定义了函数定义中this的值解析为什么。


示例

让我们假设您调用这些方法如下:

todoList.addTodo("some text");
todoList.addTodo("other text");
todoList.dispayTodo(1); // made this singular, see below for explanation
// logs out > "other text"

在上述情况下,所有三个函数都被调用为对象todoList的方法,反过来,两者内部的this值将引用todoList对象。

将包含属性todoText的对象推入this.todos数组后,您将得到以下数组:

[
{todosText:"some text"},
{todosText:"other text"}
]

您可以通过向displayTodo推送正确的索引来访问每个stay元素(尽管对代码进行了轻微修改,以接受索引作为参数)

var todoList = {
...
displayTodo: function(i) {
console.log(this.todos[i].todoText);
}
}
  1. 您可以访问todo,因为它是您正在创建的对象todoList的属性
  2. todoText不是一个变量,它是您正在创建并推送给todo的新对象的属性名。因此,它可以用于任何有权访问todo的范围

从技术上讲,您询问的任何一件事都不是变量。它们都是使用对象文字语法创建的不同对象的属性。

最新更新