CNode

关于nodejs中函数的一点疑问,欢迎大家讨论~

问答
Yyss1993发布于8 年前最后回复8 年前12 回复3674 浏览0 收藏

疑问一

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)

Y
yss1993#1·8 年前

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

S
suyuanhan#2·8 年前
引用 yss1993烦请大家能给我解答,谢谢

@yss1993 你代码写错了,倒数第二行,另外全局执行function其实上下文环境是undefined,只不过非严格模式下undefined浏览器会自动变成window

Y
yss1993#3·8 年前
引用 suyuanhan@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对象?

S
suyuanhan#4·8 年前
引用 yss1993@suyuanhan 谢谢回复!代码错误的地方已经修改过来了。关于您说的全局执行function的上下文是undefined,我在node环境下使用了严格模式来试了一下。代码如下: 假若使用的...

@yss1993 我觉得你最好看看js相关书籍高程啥的,let 来定义的是函数变量,并不能作为原型(类)的构造函数。所以new这个变量肯定是报错的。。。

Y
yss1993#6·8 年前
引用 suyuanhan@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

同样是这个结果

Y
yss1993#7·8 年前
引用 suyuanhan@yss1993 我觉得你最好看看js相关书籍高程啥的,let 来定义的是函数变量,并不能作为原型(类)的构造函数。所以new这个变量肯定是报错的。。。

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

S
suyuanhan#8·8 年前
引用 yss1993@suyuanhan 我查看了阮一峰老师的es6入门这本书,看到了截图中的那句话,使用箭头函数的时候的确是绑定了this对象。

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

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

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

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

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

X
xuj2017#12·8 年前

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

参与回复
登录后即可参与回复。登录