如果两个不同的函数各自申明了同一个变量,那么该变量只在各自的函数体内起作用。换句话说,不同函数内部的同名变量互相独立,互不影响:
'use struct': function foo(){ var x = 1; x = x +1; } function bar (){ var x= 'A'; x = x + 'B'; }
由于JavaScript的函数可以嵌套,此时,内部函数可以访问外部函数定义的变量,反过来则不行:
'use strict'; function foo(){ var x =1; function bar(){ var x = 1; function bar(){ var y= x +1; //bar 可以访问foo 的变量x } var z = y + 1; //RefernceError! foo 不可以访问bar 的变量y! } }
如果内部函数和外部函数的变量名重名怎么办?
'use strict': function foo(){ var x = 1; function bar (){ var x = 'A'; alert('x in bar() =' + x); // 'A' } alert('x in foo()=' +x) //1 bar(); }
变量提升
JavaScript的函数定义有个特点,它会先扫描整个函数体的语句,把所有申明的变量“提升”到函数顶部:
'use strict'; function foo(){ var x='Hello,'+y; alert(x); var y = 'Bob'; } foo();
对于上述foo()函数,JavaScript引擎看到的代码相当于:
function foo(){ var y; // 提升变量y的 var x = 'Hello' + y; alert(x); y = 'Bob'; }
由于JavaScript的这一怪异的“特性”,我们在函数内部定义变量时,请严格遵守“在函数内部首先申明所有变量”这一规则。最常见的做法是用一个var申明函数内部用到的所有变量:
function foo(){ var x =1, // x 初始化为1 y = x +1, // y 初始化为2 z,i; // z和i 为undefined // 其他语句 for(i =0; i<100; i++){ ... } }
全局作用域
不在任何函数内定义的变量就具有全局作用域,实际上,JavaScript 默认有一个全局作用域的变量实际上呗绑定到window 的一个属性。
‘use strict'; var sourse = 'Learn JavaScript'; alert(course); // 'Learn JavaScript'; alert(window.course); // 'Learn JavaScript'
名字空间
全局变量会绑定到window 上,不同的JavaScript 文件如果使用相同的全局变量,或者定义了相同名字的顶层函数,都会造成
命名冲突,并且很难被发现,
减少冲突的一个方法是把自己的所有的变量和函数全部绑定到一个全局变量中。
// 唯一的曲剧变量MYAPP var MYAPP = {}; //其他变量: MYAPP.name = 'myapp'; MYAPP.version = 1.0; // 其他函数 MYAPP.foo = function (){ return 'foo'; };
把自己的代码全部放入唯一的名字空间MYAPP中,会大大减少全局变量冲突的可能。
局部作用域
由于JavaScript 的变量作用域实际上是函数内部,我们在for 循环等语句块中是无法定义具有无法定义具有局部作用域的变量的。
function foo(){ for(var i = 0; i<100; i++){ // } i+=100; // 仍然可以引用变量; }
为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:
function foo(){ var sum = 0; for(let i=0; i<100;i++){ sum +=i; } i +=1; }
常量
由于var 和let 声明的变量,如果要声明一个常量,在ES6 之前是不行的,我们通常用全部大写的变量俩表示这是一个常量
不要修改他的值。
var PI = 3.14;
ES6标准引入了新的关键字const 来定义常量,const 与 let都具有块级作用域;
const PI = 3.14;
PI = 3; // 某些浏览器不报错,但是无效果。
PI; // 3.14
以上这篇JavaScript 基础函数_深入剖析变量和作用域就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章: