浏览器对js文件的解析机制
function fn(){};
fn();
console.log(i);
var i=10;
var k=20;
console.log(k);
首先,浏览器在解析这段代码前,是先把代码中的变量 i和k放到了代码最前面。还有函数表达式。
上例:
var i ;
var k ;
function fn(){};
fn();
console.log(i);//此处的console.log(i) 的结果是undefind;从执行循序来看是无法获取到i的值的。
i=10;
k=20;
console.log(k);//此处k的值就是打印出来就是 20;从执行顺序来看,可以获取到k的值。
#变量的作用域
函数的书写形式
要想了解变量的作用域需要先明白创建函数的三种形式
声明函数是使用function关键字+函数名来声明的函数
例:
function test(){
};
函数表达式是使用function关键字,但没有函数名,把函数赋值给一个变量的函数。
例:
var i = function(){
};
匿名函数是直接使用关键字来声明的函数的。
例:
function(){
};
函数表达式和声明函数的区别:
函数表达式可以直接使用()操作符。()表示立即执行。声明函数不可以直接使用。
想要使用的话,可以先把声明函数包装为函数表达式的形式。可以在对声明函数添加+、-、()等符号。推荐使用().
例:声明函数包装为函数表达式,使用();
(function(){
console.log('嘿嘿!')
})();
函数表达式使用();
a = function test(){
console.log('啊,你是嘿嘿呀!')
}();
作用域
首先了解下全局变量和局部变量。
在js中 使用 var 的定义的变量叫做局部变量。直接定义的变量就是全局变量。
例:
var i= 10; i 这个变量就是局部变量
i= 10 ; i 这个变量就是全局变量
变量的作用域
例1:
var a = 10;//a 是局部变量,如果它没有在function中,它的作用域就是整个js;
b = 20; // b是全局变量,作用域是整个js;
function fn (){
var c =30 ; //c是局部变量,它的作用域是在fn函数下。
function fn1(){
i = 40; //i 是全局变量,它的作用域是在整个js下。
var c = 40 ;//c 是局部变量,它的作用域是在fn1下。
var d = 50; //d 是局部变量,它的作用域是在fn1下。
console.log(a);
}
fn1();
}
fn()
例2:
function fn(){
var c=30;
function fn1(){
console.log(c)//此时c的值就使它父级function的c的值30;
}
}
小结;当变量是全局变量时,不论变量有没有在function下,变量的作用域都是整个js。当变量定义为局部变量时,
如果变量没有在function下,它的作用域就是整个js。如果在function下,就作用域这个function。
如果在function下有使用变量,却没有定义时,
就往上找到它的父级function,继承它父级function的值。
函数的使用方法拓展
在外部使用函数内部的变量
例1:
var j=function(){
var max = 10;
return function(){
return 1;
}()
}
var a = j ();//把值赋予a 方便调用。
console.log(j());
例2:
function fn (){
var max = 10;
var fn2 = function(num){
if(num>max){
console.log(max);
console.log(num);
}
}
return fn2;//fn2 是fn函数的返回值
}
var news=fn();//fn()是等于fn2的。
news(30);//news 调用的是fn2
计算函数参数值的和的方法
例1:function jisuan(){
var fuhao = arguments[arguments.length-1];
// var changdu = arguments.length;
if(fuhao=='+'){
for(var i= 1 ;i<arguments.length-1;i++){
arguments[0]+=arguments[i]
}
return arguments[0];
} else if (fuhao=='-') {
for(var i = 1;i<arguments.length-1;i++){
arguments[0]-=arguments[i]
}
return arguments[0];
} else if (fuhao=='*'){
for(var i = 1;i<arguments.length-1;i++){
arguments[0]*=arguments[i]
}
return arguments[0];
}else if (fuhao='/') {
for(var i = 1;i<arguments.length-1;i++){
arguments[0]/=arguments[i]
}
return arguments[0];
}
};
jisuan(10,20,30,'+');
console.log(jisuan(10,20,30,'+'));
console.log(jisuan(1,2,3,'-'));
console.log(jisuan(1,2,3,'*'));
console.log(jisuan(1,2,3,'/'));
on the way