1、先明白自调用函数的概念(是一次性的函数,在声明的同时,直接调用了)。
那么有一个问题,自调用函数是怎么推出来的呢?下图:f1是函数名,函数名中存的是函数的代码,替代后可以去掉函数名f1。
而且在页面加载后,自调用函数的代码就执行完了。下图执行结果报错,因为num是局部变量,且在函数外部没有声明和赋值。还要注意形参和实参的位置。
2、浏览器中的顶级对象是window,引用window对象的属性和方法时,可以省略window(console.log(num);)。window对象既是ECMAScript规范中的Global对象,也是BOM中的顶级对象。
下图通过给window对象的属性赋值,然后在外面去访问属性的值。注:win.num=num; 前一个是属性。
内存图如下:
至此,最初的问题就已经解决了,如何把局部变量变成全局变量?我们只要把局部变量的值给window下的属性就可以了。
3、下面进行具体的应用:通过自调用函数产生一个随机数对象,在自调用函数外面,调用该随机数对象方法产生随机数。产生随机数0-4之间的数。
<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);
//实例化随机数对象
var rm=new window.random(); //window.可以省略
//调用方法产生随机数
console.log(rm.getRandom(0,5));
// var num=rm.getRandom();
// console.log(num);
</script>