在Javascript中跨不同范围访问变量

时间:2017-02-01 01:08:16

标签: javascript scope

var todoList = {
  todos: []


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

  addTodo: function (todoText) {
    this.todos.push({todoText: todoText});
}
}

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

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

不应该在addToDo函数中声明的todoText变量的范围受限于它声明的函数addToDo?

由于

2 个答案:

答案 0 :(得分:2)

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

范围:

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

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

上下文(适用于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来访问每个逗留元素 (虽然稍微修改了代码以接受索引作为参数)

var todoList = {
  ...
  displayTodo: function(i) {
    console.log(this.todos[i].todoText);
  }
}

答案 1 :(得分:2)

  1. 您可以访问待办事项,因为它是您正在创建的对象todoList的属性。
  2. todoText不是变量,它是您正在创建并推送到待办事项的新对象的属性名称。因此,它可以在任何有权访问待办事项的范围内使用。
  3. 从技术上讲,你问过的事情都不是变量。它们都是您使用对象文字语法创建的不同对象的属性。