疑问一
javascript存在这构造函数跟普通函数,nodejs中存在这种说法吗?
看一片博客讲的lavascript构造函数跟普通函数的区别:根据上下文this的指向区分,this指向windows对象(也就是nodejs环境中的global顶层对象)时,是普通函数;this指向函数本身时就是构造函数。看代码:
function person(name, age) {
this.name = name;
this.age = age;
this.sayName = function () {
console.log('My name is %s', this.name);
}
}
var Person = new person('Tom', '22'); //此时是构造函数,this指向person
Person.sayName();
person('Tom', '22'); //此时是普通函数,this指向window对象(在浏览器环境中)
window.sayName();
按照他的这个说法,区分构造函数和普通函数是根据函数调用的方法来区分的,也就是说一个函数即是构造函数又是普通函数,是这样吗?
疑问二
在nodejs中,把所有东西都看作是对象,我的问题是,function是一个什么样的对象?当它没有别实例化的时候,为什么this指向的是global顶层对象?
烦请大家能给我解答,谢谢~
@yss1993 你代码写错了,倒数第二行,另外全局执行function其实上下文环境是undefined,只不过非严格模式下undefined浏览器会自动变成window
@suyuanhan 谢谢回复!代码错误的地方已经修改过来了。关于您说的全局执行function的上下文是undefined,我在node环境下使用了严格模式来试了一下。代码如下:
'use strict';
function fnPerson() {
console.log(this); //undefined
}
fnPerson();
假若使用的是箭头函数,代码如下:
'use strict';
let fnPerson = (name, age) => {
this.name = name;
this.age = age;
console.log(this);
}
fnPerson('Tom', '22'); //{name: "Tom", age: "22"}
var oPerson = new fnPerson('Tom', '22'); //发生异常: TypeError
这是不是证明在使用箭头函数的同时绑定了this对象?
@yss1993 我觉得你最好看看js相关书籍高程啥的,let 来定义的是函数变量,并不能作为原型(类)的构造函数。所以new这个变量肯定是报错的。。。
@suyuanhan 额 被你看出来了 尴尬
'use strict';
var fnPerson = (name, age) => {
this.name = name;
this.age = age;
console.log(this);
}
fnPerson('Tom', '22'); //{name: "Tom", age: "22"}
var oPerson = new fnPerson('Tom', '22'); //发生异常: TypeError
同样是这个结果
@suyuanhan
我查看了阮一峰老师的es6入门这本书,看到了截图中的那句话,使用箭头函数的时候的确是绑定了this对象。
@yss1993 var 和let在本质上是一样的,是对变量的声明的关键字,不过let绑定了当前作用域而已。。。。。。。
@suyuanhan 这样呀 在严格模式下 最好不要直接全局执行function;谢谢大神的答疑 万分感谢~
@suyuanhan 突然打扰,不好意思!我突然又想到了一个问题:在nodejs中一切都是对象,我的问题是function是一个什么样的对象?
建议看下这个系列的文章,对于你理解有帮助深入理解JavaScript原型和闭包
@xuj2017 好的!同时谢谢你的回复