时间:2023-02-12 10:53:29 | 栏目:JavaScript代码 | 点击:次
【解释】: 规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问。
【分类】:
局部作用域全局作用域
【分类】:
数作用域块作用域
【解释】: 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。
【示例】:
<script> // 声明 counter 函数 function counter(x, y) { // 函数内部声明的变量 let s = x + y; console.log(s); // 18 } // 调用 counter 函数 counter(10, 8); // 访问变量 s console.log(s); // 报错 外部无法访问函数内部的变量 </script>
【总结】:
【解释】: 在 JavaScript 中使用 {}
包裹的代码称为代码块,代码块内部声明的变量外部将【有可能】无法被访问。
【示例】:
<script> { // age 只能在该代码块中被访问 let age = 18; console.log(age); // 正常 } // 超出了 age 的作用域 console.log(age); // 报错 let flag = true; if(flag) { // str 只能在该代码块中被访问 let str = 'hello world!'; console.log(str); // 正常 } // 超出了 age 的作用域 console.log(str); // 报错 for(let t = 1; t <= 6; t++) { // t 只能在该代码块中被访问 console.log(t); // 正常 } // 超出了 t 的作用域 console.log(t); // 报错 </script>
【常量值】: JavaScript 中除了变量外还有常量,常量与变量本质的区别是 【常量必须要有值且不允许被重新赋值】,常量值为对象时其属性和方法允许重新赋值。
【示例】:
<script> // 必须要有值 const version = '1.0'; // 不能重新赋值 // version = '1.1'; // 常量值为对象类型 const user = { name: '小明', age: 18 } // 不能重新赋值 user = {}; // 属性和方法允许被修改 user.name = '小小明'; user.gender = '男'; </script>
【总结之let、var、const】:
let 声明的变量会产生块作用域,var 不会产生块作用域
const声明的常量也会产生块作用域
不同代码块之间的变量无法互相访问
推荐使用 let
或 const
开发中 let
和 const
经常不加区分的使用,如果担心某个值会不小被修改时,则只能使用 const
声明成常量。
关键字 | 块级作用域 | 变量提升 | 初始值 | 更改值 | 通过window调用 |
---|---|---|---|---|---|
let | √ | × √ | - | √ | × |
const | √ | × √ | √ | × | × |
var | × | √ | - | √ | √ |
【解释】: <script>
标签和 js 文件的【最外层】就是所谓的全局作用域,在此声明的变量在函数内部也可以被访问。
【示例】:
<script> // 此处是全局 function sayHi() { // 此处为局部 } // 此处为全局 </script> <script> // 此处是全局 function sayHi() { // 此处为局部 } // 此处为全局 </script>
全局作用域中声明的变量,任何其它作用域都可以被访问
<script> // 全局变量 name let name = '小明'; // 函数作用域中访问全局 function sayHi() { // 此处为局部 console.log('你好' + name); } // 全局变量 flag 和 x let flag = true; let x = 10; // 块作用域中访问全局 if(flag) { let y = 5; console.log(x + y); // x 是全局的 } </script>
【总结】:
window
对象动态添加的属性默认也是全局的,不推荐!【解释】: 函数内部允许创建新的函数,f
函数内部创建的新函数 g
,会产生新的函数作用域,由此可知作用域产生了嵌套的关系。作用域链本质上是底层的变量查找机制,在函数被执行时,会优先查找当前函数作用域中查找变量,如果当前作用域查找不到则会依次逐级查找父级作用域直到全局作用域
【示例】:
<script> // 全局作用域 let a = 1; let b = 2; // 局部作用域 function f() { let c; // 局部作用域 function g() { let d = 'yo'; } } </script>
<script> // 全局作用域 let a = 1; let b = 2; // 局部作用域 function f() { let c; // let a = 10; console.log(a); // 1 或 10 console.log(d); // 报错 // 局部作用域 function g() { let d = 'yo'; // let b = 20; console.log(b); // 2 或 20 } // 调用 g 函数 g() } console.log(c); // 报错 console.log(d); // 报错 f(); </script>
【总结】:
【解释】: 闭包是一种比较特殊和函数,使用闭包能够访问函数作用域中的变量。
【好处】: 可以把一个变量使用范围延伸
【示例】:
<script> function foo() { let i = 0; // 函数内部分函数 function bar() { console.log(++i); } // 将函数做为返回值 return bar; } // fn 即为闭包函数 let fn = foo(); fn(); // 1 </script>
【总结】:
【解释】: 允许在变量声明之前即被访问
【示例】:
<script> // 访问变量 str console.log(str + 'world!'); // 声明变量 str var str = 'hello '; </script> let和var都有提升,但是let定义的变量没有赋值之前是不可以使用、var可以使用是undefined
【总结】:
声明的变量不存在变量提升,推荐使用
let`【也有人认为具有提升但是不赋值不能使用】【解释】: 函数在声明之前即可被调用
【示例】:
<script> // 调用函数 foo(); // 声明函数 function foo() { console.log('声明之前即被调用...'); } // 不存在提升现象 bar(); var bar = function () { console.log('函数表达式不存在提升现象...'); } </script>
【总结】:
【示例】:
<script> // 设置参数默认值 function sayHi(name="小明", age=18) { document.write(`<p>我叫${name},我今年${age}岁了。</p>`); } // 调用函数 sayHi(); sayHi('小红'); sayHi('小刚', 21); </script>
【总结】:
undefined
【解释】: arguments` 是函数内部内置的伪数组变量,它包含了调用函数时传入的所有实参。
【示例】:
<script> // 求生函数,计算所有参数的和 function sum() { // console.log(arguments); let s = 0; for(let i = 0; i < arguments.length; i++) { s += arguments[i]; } console.log(s); } // 调用求和函数 sum(5, 10); // 两个参数 sum(1, 2, 4); // 两个参数 </script>
【注意】:
【语法及示例】:
<script> function config(baseURL, ...other) { console.log(baseURL); // other 是真数组,动态获取实参 console.log(other); } // 调用函数 config('http://baidu.com', 'get', 'json'); </script>
【解释】: 箭头函数是一种声明函数的简洁语法,它与普通函数并无本质的区别,差异性更多体现在语法格式上。
【示例】:
<script> // 箭头函数 let foo = () => { console.log('^_^ 长相奇怪的函数...'); } // 调用函数 foo(); // 更简洁的语法 let form = document.querySelector('form'); form.addEventListener('click', ev => ev.preventDefault()); </script>
【总结】:
{}
,并自动做为返回值被返回arguments
,只能使用 ...
动态获取实参