作用域决定了变量、常量和参数被定义的时间和位置当某个变量的作用域是一个给定的函数时必须要记住形参只有在函数被调用的时候才存在编程实参。一个函数可能会被调用多次每次函数调用开始时参数才是真实存在的在函数返回后参数就失去作用域了变量和常量也只有在创建后才存在。也就是说在使用let或const声明之前他们是没有作用域的var是特例作用域或者可见性指的是当前可见并且可以被正在执行的代码块称作执行上下文访问的标识符在JavaScript中作用域是静态的这意味着只能通过阅读源代码就能确定变量的作用域静态作用域静态作用域在某个作用域内定义了某个函数而不是调用函数该作用域包含所有变量也在该函数的作用域内在JavaScript中静态作用域适用于全局作用域、块作用域、以及函数作用域全局作用域在全局作用域中生命的一切在当前程序的作用域的所有作用域内都是可用的在全局作用域中声明的变量叫全局变量谨慎地使用——努力避免依赖全局作用域块作用域let和const关键字声明的变量名处在块作用域中块作用域指的是那些仅仅在代码块内有效的变量console.log(before block); { console.log(inside block); const x 3; //打印3 console.log(x); } console.log(outside block; x${x}); //ReferenceError: x未定义解析这里有一个独立的块块通常是控制流语句的一部分例如if或for但定义独立的块也是合法的。在块内定义了变量x一旦出了此块x就不在作用域内就会被认为是未定义的变量屏蔽变量屏蔽有时候也叫做变量阴影即一个相同名字的变量会将外部作用域的变量屏蔽起来作用域的层次结构可以在原有的作用域中进入一个新的作用域。此时会建立一个作用域链来决定哪些变量在作用域中当前作用域链中的所有变量都在作用域内并且只要它们没有被屏蔽都是可以被访问的即时调用函数表达式函数表达式允许创建即时调用函数表达式IIFEIIFE声明了一个函数并立即执行该函数(function() { //使用函数表达式创建了一个匿名函数然后立即调用该函数 //这里为IIFE代码 })();IIFE好处任何内部信息都有自己的作用域并且因为它本身就是函数他还可以向作用域外传递信息比较常见的返回值有数组、对象以及函数可以打印出自己被调用的次数而且次数不会被篡改函数作用域和提升使用let声明变量变量只在声明之后才存在。而使用var声明变量在当前作用域中任意地方都可用甚至可以在声明前使用PS未声明的变量和值为undefined的变量不是同一个概念。使用未声明的变量会报错但可以安全使用语句存在且值为undefined的变量//使用let时如果引用的变量未声明将会得到一个错误 x; //ReferenceErrorx未定义 let x 3; //永远不会执行——因为错误终止了程序 //而用var声明的变量可以在声明前被引用 x; //undefined var x 3; x; //3原因var声明的变量采用了提升机制JavaScript会扫描整个作用域函数或者全局作用域任何使用var声明的变量都会被提升至作用域的顶部使用var声明的变量JavaScript不会关心它是否有重复声明函数提升类似于var声明的变量函数声明也会被提升至它们作用域的顶部这允许在函数声明之前调用严格模式严格模式阻止隐式全局变量在开始编写代码之前单独插入一行字符串use strict单引号或双引号都可以就可以启动严格模式为了避免麻烦可将所有代码封装宰割立即执行的函数中(function() { use strict; //所有代码从这里开始...代码会按照严格模式执行 })();
JavaScript基础知识介绍——作用域(静态作用域、全局作用域、IIFE、函数作用域和提升、严格模式)
作用域决定了变量、常量和参数被定义的时间和位置当某个变量的作用域是一个给定的函数时必须要记住形参只有在函数被调用的时候才存在编程实参。一个函数可能会被调用多次每次函数调用开始时参数才是真实存在的在函数返回后参数就失去作用域了变量和常量也只有在创建后才存在。也就是说在使用let或const声明之前他们是没有作用域的var是特例作用域或者可见性指的是当前可见并且可以被正在执行的代码块称作执行上下文访问的标识符在JavaScript中作用域是静态的这意味着只能通过阅读源代码就能确定变量的作用域静态作用域静态作用域在某个作用域内定义了某个函数而不是调用函数该作用域包含所有变量也在该函数的作用域内在JavaScript中静态作用域适用于全局作用域、块作用域、以及函数作用域全局作用域在全局作用域中生命的一切在当前程序的作用域的所有作用域内都是可用的在全局作用域中声明的变量叫全局变量谨慎地使用——努力避免依赖全局作用域块作用域let和const关键字声明的变量名处在块作用域中块作用域指的是那些仅仅在代码块内有效的变量console.log(before block); { console.log(inside block); const x 3; //打印3 console.log(x); } console.log(outside block; x${x}); //ReferenceError: x未定义解析这里有一个独立的块块通常是控制流语句的一部分例如if或for但定义独立的块也是合法的。在块内定义了变量x一旦出了此块x就不在作用域内就会被认为是未定义的变量屏蔽变量屏蔽有时候也叫做变量阴影即一个相同名字的变量会将外部作用域的变量屏蔽起来作用域的层次结构可以在原有的作用域中进入一个新的作用域。此时会建立一个作用域链来决定哪些变量在作用域中当前作用域链中的所有变量都在作用域内并且只要它们没有被屏蔽都是可以被访问的即时调用函数表达式函数表达式允许创建即时调用函数表达式IIFEIIFE声明了一个函数并立即执行该函数(function() { //使用函数表达式创建了一个匿名函数然后立即调用该函数 //这里为IIFE代码 })();IIFE好处任何内部信息都有自己的作用域并且因为它本身就是函数他还可以向作用域外传递信息比较常见的返回值有数组、对象以及函数可以打印出自己被调用的次数而且次数不会被篡改函数作用域和提升使用let声明变量变量只在声明之后才存在。而使用var声明变量在当前作用域中任意地方都可用甚至可以在声明前使用PS未声明的变量和值为undefined的变量不是同一个概念。使用未声明的变量会报错但可以安全使用语句存在且值为undefined的变量//使用let时如果引用的变量未声明将会得到一个错误 x; //ReferenceErrorx未定义 let x 3; //永远不会执行——因为错误终止了程序 //而用var声明的变量可以在声明前被引用 x; //undefined var x 3; x; //3原因var声明的变量采用了提升机制JavaScript会扫描整个作用域函数或者全局作用域任何使用var声明的变量都会被提升至作用域的顶部使用var声明的变量JavaScript不会关心它是否有重复声明函数提升类似于var声明的变量函数声明也会被提升至它们作用域的顶部这允许在函数声明之前调用严格模式严格模式阻止隐式全局变量在开始编写代码之前单独插入一行字符串use strict单引号或双引号都可以就可以启动严格模式为了避免麻烦可将所有代码封装宰割立即执行的函数中(function() { use strict; //所有代码从这里开始...代码会按照严格模式执行 })();