自调函数:和普通函数的区别时编译到该函数时立即执行,所以也叫立即执行函数。
它执行过后会销毁自己的执行期上下文。
(function (形参){
代码块
})(实参)
局部变量和全局变量的区别
<script>
var a = 10;//全局变量
function zi(){
var a = 5;//局部变量
console.log(a);// 输出5;
}
zi();
console.log(a);// 输出10
</script>
<script>
var a = 10;
function zi(){
console.log(a);// 输出10;
}
zi();
console.log(a);// 输出10
</script>
<script>
var a = 10;
function zi(){
var a;
console.log(a);// 输出undefined;
}
zi();
console.log(a);// 输出10
</script>
<script>
function zi(){
var a = 5;
console.log(a);// 输出5;
}
zi();
console.log(a);// 报错Uncaught ReferenceError: a is not defined
</script>
从上面几个例子中我们可以看出当函数zi()中定义了变量a时输出函数中变量a的值;
当没有定义时输出函数外赋给变量a值(全局变量);当时只有函数里声明a时,函
数外是无法查询到这个值(没有声明过)所以会报错;
由于全局变量都存储在window
对象里
<script>
(function (win){
var a = 5;// 声明并给变量a赋值
win.a = a;// 将局部变量a存储到window对象里
console.log(a);// 输出5;
})(window)
console.log(a); // 输出5
</script>
或者
<script>
(function (){
a = 5;// 不声明给变量a赋值
console.log(a);// 输出5;
})()
console.log(a); // 输出5
// 该方法无法在严格模式"user strict"下使用
</script>
<script>
var a = 10;//全局变量
function zi(){
a++;
}
zi();
console.log(a);// 输出11
</script>
另外可以尝试看看上面这段函数思索闭包的形成原理
eg:
<script>
(function (window) {
// 创造一个构造函数
function Random() {
}
// 给构造函数的原型对象中添加方法
Random.prototype.getRandom = function (min,max) {
return Math.floor(Math.random()*(max-min)+min);// floor向下取整
};
//把Random对象暴露给顶级对象window--->外部可以直接使用这个对象
window.random=Random;//将函数名字给了属性Random
})(window);
//用 new 实例化对象让他成为一个对象(可以打点调用里面的函数(方法))
var rm=new window.random(); //window.可以省略
//调用方法产生随机数
console.log(rm.getRandom(0,10));
// var num=rm.getRandom();
// console.log(num);
</script>