为什么 console.log 被写出来了?
why is console.log being written out?
我有以下内容,想知道 taskInput 是如何更新的。
我在 js 的顶部获取 taskInput。然后我在 'submit' 的表单中添加了一个监听器。因此,当我通过单击添加任务提交表单时,为什么我不必再次获取 taskInput 来查看它的新值?
const taskInput = document.getElementById('task');
const form = document.querySelector('form');
const filter = document.querySelector('input[name="filter"]');
const taskList = document.querySelector('ul.collection');
const clearall = document.querySelector('.clear-tasks');
loadAllEventListeners()
function loadAllEventListeners(){
form.addEventListener('submit',submit)
}
function submit(e){
e.preventDefault();
console.log(taskInput.value)
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<title>Task List</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List 1</span>
<div class="row">
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task </label>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<div class="input-field col s12">
<input type="text" name="filter" id="filter">
<label for="filter">Filter Tasks</label>
</div>
<ul class="collection"></ul>
<a href="#" class="clear-tasks btn black">Clear Tasks</a>
</div>
</div>
</div>
</div>
</div>
<script
src="https://code.jquery.com/jquery-3.2.1.js"
integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
</body>
</html>
您不是根据输入字段值创建 const,而是根据输入 DOM id="task" 的元素本身。 DOM 元素是具有随时间变化的属性的对象。 const 赋值引用 DOM 元素的这个确切实例。通过对对象的 const 赋值,您不能更改对新对象的引用,但对象中的每个值仍然是可变的。
如果我不正确地理解你的问题,我深表歉意。但是你在问为什么你不必为 taskInput(输入字段)手动更新 JS 中的值?
意思是为什么它会自动获取每次输入的新值?
如果那是你要问的,那是因为当你写
const taskInput = document.getElementById('task');
它实际上是在获取对表示输入字段的 Element 对象的引用,而不是实际的 .value
属性.
所以 taskInput
只是指向输入元素对象,当输入元素对象更新时,作为元素引用的变量也会显示更新后的值。
类似这个-
const obj = {
value: 2
};
const reference = obj;
console.log(reference) // will output { value: 2 }
obj.value = 5;
console.log(reference) // will output { value: 5 }
所以我们从来没有直接接触过 reference
变量,我们只更新了 obj
但是因为 reference
只是 指向 到 value of obj
(这是一个对象)它也反映了更新后的值
查看这些链接以进一步阅读:
- JavaScript by reference vs. by value
- https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0
我有以下内容,想知道 taskInput 是如何更新的。
我在 js 的顶部获取 taskInput。然后我在 'submit' 的表单中添加了一个监听器。因此,当我通过单击添加任务提交表单时,为什么我不必再次获取 taskInput 来查看它的新值?
const taskInput = document.getElementById('task');
const form = document.querySelector('form');
const filter = document.querySelector('input[name="filter"]');
const taskList = document.querySelector('ul.collection');
const clearall = document.querySelector('.clear-tasks');
loadAllEventListeners()
function loadAllEventListeners(){
form.addEventListener('submit',submit)
}
function submit(e){
e.preventDefault();
console.log(taskInput.value)
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">
<link href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN" crossorigin="anonymous">
<title>Task List</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col s12">
<div id="main" class="card">
<div class="card-content">
<span class="card-title">Task List 1</span>
<div class="row">
<form id="task-form">
<div class="input-field col s12">
<input type="text" name="task" id="task">
<label for="task">New Task </label>
</div>
<input type="submit" value="Add Task" class="btn">
</form>
</div>
</div>
<div class="card-action">
<h5 id="task-title">Tasks</h5>
<div class="input-field col s12">
<input type="text" name="filter" id="filter">
<label for="filter">Filter Tasks</label>
</div>
<ul class="collection"></ul>
<a href="#" class="clear-tasks btn black">Clear Tasks</a>
</div>
</div>
</div>
</div>
</div>
<script
src="https://code.jquery.com/jquery-3.2.1.js"
integrity="sha256-DZAnKJ/6XZ9si04Hgrsxu/8s717jcIzLy3oi35EouyE="
crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
</body>
</html>
您不是根据输入字段值创建 const,而是根据输入 DOM id="task" 的元素本身。 DOM 元素是具有随时间变化的属性的对象。 const 赋值引用 DOM 元素的这个确切实例。通过对对象的 const 赋值,您不能更改对新对象的引用,但对象中的每个值仍然是可变的。
如果我不正确地理解你的问题,我深表歉意。但是你在问为什么你不必为 taskInput(输入字段)手动更新 JS 中的值?
意思是为什么它会自动获取每次输入的新值?
如果那是你要问的,那是因为当你写
const taskInput = document.getElementById('task');
它实际上是在获取对表示输入字段的 Element 对象的引用,而不是实际的 .value
属性.
所以 taskInput
只是指向输入元素对象,当输入元素对象更新时,作为元素引用的变量也会显示更新后的值。
类似这个-
const obj = {
value: 2
};
const reference = obj;
console.log(reference) // will output { value: 2 }
obj.value = 5;
console.log(reference) // will output { value: 5 }
所以我们从来没有直接接触过 reference
变量,我们只更新了 obj
但是因为 reference
只是 指向 到 value of obj
(这是一个对象)它也反映了更新后的值
查看这些链接以进一步阅读:
- JavaScript by reference vs. by value
- https://codeburst.io/explaining-value-vs-reference-in-javascript-647a975e12a0