面试的时候遇到了类似下面的一道题,当时lz混淆了普通函数和构造函数的区别。先以下面的代码为例理解一下普通函数和构造函数的区别。
var say = function() {
var num = 0;
var sayValue = function() {
alert(num);
}
num++;
return sayValue;
}
var sayValue = new say();
sayValue(); //1
sayValue(); //1
var a = say;
a(); //function () {alert(num);}
普通函数和构造函数的区别:
1.调用方式:
构造函数使用new操作符,sayValue = new say()可以省略小括号;
普通函数不需要new操作符,var a = say不添加小括号命名的变量是指向函数say的指针没有调用,var a = say()添加括号后是变量a的值为函数say的返回值。
2.this指向
构造函数的this绑定到新创建的对象实例;
普通函数this属于该函数的调用者,上面例子中的this就是window。
3.命名
构造函数通常首字母大写;
普通函数首字母小写,遵循驼峰命名方法。
上面的代码:
var sayValue = new say()是命名构造函数,sayValue打印出来的结果是function () {alert(num);}。无论调用几次sayValue(),num的值都是1。
var a = say()是命名一个普通函数,a()打印出来的值是function () {alert(num);},是say()函数的返回值。
理解若有偏差,欢迎指正,谢谢!