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);
}
}
- 您可以访问todo,因为它是您正在创建的对象todoList的属性
- todoText不是一个变量,它是您正在创建并推送给todo的新对象的属性名。因此,它可以用于任何有权访问todo的范围
从技术上讲,您询问的任何一件事都不是变量。它们都是使用对象文字语法创建的不同对象的属性。