JS立即执行函数与模块化
立即执行函数
函数定义好之后立马执行
**函数表达式的方式:**函数表达式后面加()即可立即执行函数
var xmlhttpUtil = function () {
function getText(url,callback){
alert("dog");
}();
匿名函数形式的立即执行函数
匿名函数不允许作为单独的语句直接出现于javascript中,因此要想立即执行函数,必须做出一些符合语法的改变:
方法1 是将匿名函数赋值给一个变量,这就成了函数表达式,可在其后加括号立即执行。
方法2 匿名函数外面套一个括号(这是js语法允许的),这就相当于成了函数表达式,然后再在其后加括号即可立即执行。
(function(b){
alert(b);
})(321);
模块化
由于函数内部的变量不会污染全局作用域,因此立即执行函数可用于模块化,很多第三方库都采用了这种方式。
模块化进化史
- 定义全局函数:会导致变量被污染,引起变量名冲突;
- namespace(简单对象封装)模式 :将函数方法直接放到对象中,减少了全局变量,但是这种情况下数据不是私有的,仍然可以外部进行修改;
- IIFE模式(匿名函数自调用):数据是私有的, 外部只能通过暴露的方法操作,但是如果当前模块依赖另一个模块怎么办
- commonjs
简单复习一下原型
构造对象
通俗的话来说,就是在script标签中声明的那个函数
<body>
<script>
function students() {
/* 我就是构造函数 */
}
</script>
</body>
原型对象
在声明了一个函数之后,浏览器会自动按照一定的规则创建一个对象,这个对象就叫做原型对象,这个原型对象其实是存储在内存中的。
在声明了一个函数之后,这个构造函数(声明了的函数)中有一个属性prototype,这个属性指向的就是这个构造函数对应的原型对象;这个原型对象中有一个属性constructor,这个属性指向的就是这个构造函数(声明了的函数)。
当我们使用构造函数去创建对象时
<body>
<script>
function students() {
/* 我就是构造函数 */
}
var stu = new students();
</script>
</body>
此时,stu就是构造函数students创建出来的对象,这个对象中时没有prototype属性的,prototype属性只有在students中有;
但是stu有一个__proto__属性,stu调用这个属性就可以直接访问到students的原型对象;
总结:
- prototype属性:
prototype存在于构造函数中,指向这个构造函数的原型对象 - constructor属性
constructor属性存在于原型对象中,她指向了构造函数
我们根据需要,可以students.prototype 属性指定新的对象,来作为students的原型对象。但是这个时候有个问题,新的对象的constructor属性则不再指向students构造函数了。 - proto 属性(注意:左右各是2个下划线):
用构造方法创建一个新的对象之后,这个对象中默认会有一个属性__proto__, 这个属性就指向了构造方法的原型对象。
this指向问题
this:表示当前对象的一个引用。
this的指向:this不是固定不变的,是根据调用的上下文(执行时环境)改变而改变。
- 如果单独使用,this 表示全局对象。
- 在方法中,this 表示该方法所属的对象。
- 在函数中,this 表示全局对象,构造函数中,this表示构造函数的实例对象。
- 在函数中,在严格模式下,this 是未定义的(undefined)。
- 在事件中,this 表示接收事件的元素。
自定义(手写)Promise
promise手写
https://juejin.cn/post/6978371488789299230