关于nodejs中函数的一点疑问,欢迎大家讨论~
发布于 6 年前 作者 yss1993 2521 次浏览 来自 问答

疑问一

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顶层对象?

12 回复

烦请大家能给我解答,谢谢~

@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 额 被你看出来了 尴尬

@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 QQ截图20180626093443.png
我查看了阮一峰老师的es6入门这本书,看到了截图中的那句话,使用箭头函数的时候的确是绑定了this对象。

@yss1993 var 和let在本质上是一样的,是对变量的声明的关键字,不过let绑定了当前作用域而已。。。。。。。

@suyuanhan 这样呀 在严格模式下 最好不要直接全局执行function;谢谢大神的答疑 万分感谢~

@suyuanhan 突然打扰,不好意思!我突然又想到了一个问题:在nodejs中一切都是对象,我的问题是function是一个什么样的对象?

建议看下这个系列的文章,对于你理解有帮助深入理解JavaScript原型和闭包

@xuj2017 好的!同时谢谢你的回复

回到顶部