js作用域与立即执行函数

js作用域与立即执行函数

1、全局作用域

var a = 10;
function One(){
    console.log(a)
}
function Two(){
    var a = 20;
    One()
}
Two();//10
a = 10是全局的,而 a = 20 是局部的

2、变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层

一、
var a = 10;
function One(){
console.log(a);
var a = 20;
}
One();//undefined 一是预解析,而是就近查找。
二、var a = 10function One(){
    console.log(a);
    a = 20;
}
One();//10
这个虽然是就近原则,但是就近找var声明的变量,因为a = 20没有var声明,只是修改了a的值,所以到外面去找了,输出的是10.注意:当a = 20时,console.log进行输出还没执行到那。
var a = 10;
function One(){
    a = 20;
    console.log(a);
}
One();//20

3、全局作用域与函数作用域

var a = 10
function One(){
    Two();
    console.log(a);
    function Two(){
        var a = 20
    }
}
One();

4、当参数跟局部变量重名时,优先级是等同的。

var a = 10;
funtion One(){
    console.log(a);
    var a = 20;
}
One(a);//10
js中传参时,基本类型传值,引用类型传引用。
var a = 5;
var b = 5;
b += 3
console.log(a);//5
var a = [1,2,3];
var b = a;
b = [1,2,3,4];
console.log(a);//[1,2,3]
参数与变量一样也是有作用域
var a = 10;
function One(a){
    a += 3
    console.log(a);
}
One();//10
var a = 10;
function One(a){
    a += 3
    console.log(a);
}
One();
console.log(a)//13

立即执行函数

一、js立即执行函数的写法
第一种:最前最后加括号

(function(){console.log(1);}());

第二种:function外面加括号

(function(){console.log(1);})();

第三种:function前面加运算符,常见的是!

function(){console.log(1);}();

二、立即执行函数的参数
可以给立即执行函数传递参数

(function(a,b){
    console.log("用" + a + "+" + b);
}("zimu",new Date()));

注意:
1、立即执行函数内部是可以访问外部变量的,所以很多情况下,我们并不需要传参数。
三、立即执行函数的返回值
一个立即执行函数也能返回值并且可以复制给其它变量

var result =(function(){
    return 2 + 2;
}());
var result = (function(){
    return 2 + 2;
})();

四、立即执行函数的优势
1、立即执行函数可以封装大量的工作而不会遗留任何全局变量。
2、定义的所有变量都会成为立即执行函数的局部变量,所以你不用担心这些临时变量会污染全局空间。
五、注意点
立即执行函数通常作为一个单独模块使用。一般没有问题。但是,建议在自己写的立即执行函数前加分号,这样可以有效地与前面代码进行隔离。否则,可能出现意想不到的错误。

var a = 12
var b = a
(function(){var c = 14;}())//is not a function

猜你喜欢

转载自blog.csdn.net/HLHis1996/article/details/107762877
今日推荐