JavaScript基础04
变量的作用域
function yc(){ var x = 1; x = x+2; console.log(x) } //变量一定要写在作用域里面否则报错。 </script>
如果两个函数使用了相同的变量名,只要在函数方法的内部,就不会冲突
function yc(){ var x = 1; x = x+2; console.log(x) } yc(); //变量一定要写在作用域里面否则报错。 function yc1(){ var x = 1; x = x+2; console.log(x) } yc1();
function yc1(){ var x = 1; x = x+2; console.log(x) } yc1(); function yc2(){ var x = 1; function yc3(){ var y = x + 1; console.log(y) } yc3();
假设 内部的函数变量和外部函数的变量重名
function yc4(){ var x = 1; function yc5(){ var x = "A" console.log(x,"内部的") } yc5(); console.log(x,"外部的") } yc4();
假设在js中函数查找变量回从内而外进行查找,如果外部存在同名的函数变量,那么内部的函数就会屏蔽外部的函数变量,使用本身。
提升作用域
function yc6(){ var y; var x = 'x'+y; consloe.log(x) //如果没有定义y的话就会提示,y is not defind var y ='y' //如果定义了机会提示 undefind } yc6();
结果underfind
js引擎自动提升了y的声明 但是不会提升y的赋值
function yc6(){ var y; var x = 'x'+y; consloe.log(x) //如果没有定义y的话就会提示,y is not defind var y ='y' //如果定义了机会提示 undefind } yc6();
建议一定要把所有要是能用到的变量,全部放到函数的头部。
//把要用到的函数都放到开头 function yc7(){ var y = "y"; var x = "x" + y; console.log(x) var z,i,o;//undefined } yc7();
全局作用域
var x = "colddd" alert(x) //window window.alert(x) var old_alert = window.alert; window.alert = function (){ }; //失效了 window.alert("123123123") window.alert=old_alert; //恢复 window.alert("121332425")
js只会有一个全局作用域 ,任何变量 函数,都可以视为变量
如果这个函数作用域找不到,全局也找不到 就会报 is not a function
由于我们所有的全局变量都会绑定到window上,如果不同的js文件使用了相同的全局变量就会冲突
全局变量
//唯一的全局变量 var cold = {}; //定义全局变量 cold.name = "冰凉"; cold.add = function(x,y){ return x + y; }
局部作用域
function aaa(){ for(var i=0;i<100;i++){ console.log(i); } console.log(i+1)//为啥i除了作用域还是可以用? }
ES6 let关键字 解决了局部作用域的冲突问题
function aaa(){ for(let i=0;i<100;i++){ console.log(i); } console.log(i+1)//i is not defined }
推荐使用let去定义局部作用域的变量。
const PI = '3.1415' console.log(PI) PI='19'//Assignment to constant variable.
const里面的值 是只读属性,不可以修改。