简单介绍一下变数在JS中的几个性质,之後的篇章会比较深入的讲解,这些性质背後的原因们
var a=1;
var b='2'
var c=function(){return 3}
var d=false
console.log(typeof a); //number
console.log(typeof b); //string
console.log(typeof c); //function
console.log(typeof d); //boolean
JS不像Java一样用int, String, boolean等关键字宣告变数。
JS的变数在ES6以前只有var,ES6以後也顶多新增了let, const,变数的typeof都需要等到赋值才能决定。
var a;
console.log(a); //undefined
console.log(typeof a); //undefined
用var宣告变数,初始化为undefined。还没赋值前,无法判断该变数的type
小结论:变数的type,用变数的value判断
有效范围讲的专业一点叫作用域(scope)
,var变数是遵照 function scope
。
就是变数存在的地方。
有点像寄生物与宿主的关系,寄生物离开宿主多久就会死掉。
变数离开他的作用域,就会被垃圾回收机制给丢掉。灯灯灯灯灯灯灯灯灯,垃圾车来罗~
function scope
」讲人话就是:var
关键字令出的变数,他的有效范围以function
界定。
console.log('用var关键字 定义变数i')
console.log('--------------------------')
var i='全域变数';
console.log(`i=${i}`);
//`i=${i}` 等价於 'i='+i 字串连接
// ` 反引号在~键上面 (我一开始还找不到,所以特别写这行)
console.log('--------------------------')
function fun(){
var i='function内变数';
console.log(`I'm in the function, i=${i}`)
};
fun();
console.log('--------------------------')
console.log(`I'm out of the function, i=${i}`);
console.log('--------------------------')
console.log("I'm in the for loop")
for(var i=0;i<5;i++){
console.log(`i=${i}`)
} //i=5离开for回圈
console.log('--------------------------')
console.log(`I'm out of the for loop, i=${i}`);
用var关键字 定义变数i
--------------------------
i=全域变数
--------------------------
I'm in the function, i=function内变数
--------------------------
I'm out of the function, i=全域变数
--------------------------
I'm in the for loop
i=0
i=1
i=2
i=3
i=4
--------------------------
I'm out of the for loop, i=5
离开for loop
後,我们再次呼叫变数i
,得到的答案是:5。
原因是for loop
不是function
,会影响到在全域
用var
定义的变数i
。
var i='全域变数';
function outterFun(){
function innerFun(){
console.log(i)
}
return innerFun;
};
aNewFun=outterFun();
aNewFun(); //全域变数
outterFun
里面的inner function
,找不到变数i
→ 往外向outterFun
找outterFun
找不到变数i
→向全域
找Uncaught ReferenceError: i is not defined
小结论:
function scope
首先先来厘清变数和属性,他们有以下几个关系:
一般情况,变数放在一个object里面,那该变数就会叫object的属性
function虽然是一个object,但var变数的作用域(scope)是以function为界,
所以function外,别想拿到function的内变数
function外,如果硬要存取内变数,可以把它从function return出来,变得与function本身同级。
function外,可以存取属性。
没错,你没看错,function可以有属性,因为function是object嘛~~
function aFun(){
let a='function内变数';
return a; //可以透过return,让function外,可以取出内变数
}
aFun.a='function物件属性';
console.log(`aFun.a= ${aFun.a}`) // aFun.a= function物件属性
console.log(`aFun return a= ${aFun()}`); //aFun return a= function内变数
小结论:
function scope
console.log(a);
fun();
console.log('----------')
function fun(){
console.log(b)
var b=2;
}
var a=1;
var a; //初始化undefined
function fun(){
var b //初始化undefined
console.log(b)
b=2;
}
console.log(a); //undefined
fun(); //undefined
console.log('----------')
a=1;
console.log(a); //1
var a='全域a';
console.log(`a=${a}`)
console.log(`a=${fun('实参')}`)
outerfun();
fun1();
function outerfun(){
a='在outerfun中改a值'
var a='outterfun a'
for(var a=0;a<5;a++){
console.log(`a=${a}`?)
a='for loop里面的a'
console.log(`a=${a}`)
}
console.log(`a=${a}`);
function innerfun(){
console.log(`a=${a}`);
}
innerfun();
}
function fun(a){
return a;
}
function fun1(){
a='在fun1中改a值'
}
console.log(`a=${a}`)
小提醒:变数
前面没写var
,要嘛是引用自己或是引用外层的变数,
要嘛就是新建全域变数,但这种不会提升
.
.
.
.
.
.
.
.
.
.
.
a=全域a
a=实参
a=0
a=for loop里面的a
a=NaN
a=NaN
a=在fun1中改a值
//模拟:for回圈里的a
var num='我是字串,我要先被加1,再被转成number'
num+=1 //'我是字串,我要先被加1,再被转成number1'
num =Number(num) //string转number
console.log(num) //NaN
console.log(typeof num) //number
//模拟:判断是否离开for回圈
//句型:(判断句)?true执行:fales执行
console.log((NaN<5)?'yes':'no') //no,离开for回圈
a在各个function scope中,被改值的过程
>>: [Day 13] 资料产品生命周期管理-加工资料(二)
Virtual Memory tags: IT铁人 跟上一篇有点关系的内容,我们会利用Disk来代替...
前言 Hi, 我是鱼板伯爵这里我们要将Google登入与介面做连接,所以又要使用Bloc了,老样子按...
Spinne-下拉式选单 跟ListView很像但是比较小 ListView单选+或选到很多样 ac...
一日客语:中文:蛋 客语:唇 ES6语法 是constructor function 一种语法糖 函...
今天会接续昨天的部分继续讲解 Theme 的 Spacing,这部分其实很简单各位可以透过这里直接引...