this一直是一个JS中的困扰问题,这次在跑JS精粹的代码的时候顺带发现了Node里面全局变量的问题

var x = 1;
var myObj = {
x: 2
};
myObj.func = function() {
var print = function() {
console.log("this.x is:"+this.x); //undefined
}
print();
}
myObj.func();

如果上面的这句话,跑在浏览器中,最后输出的会是 this.x is: 1

如果这句话跑在 Node.js 的环境中,最后输出 'this.x is: undefined`。

这都来源于JS这门语言中设计的内容:this默认绑定的是全局。我们所能想到的合理的设计,应该是this绑定于函数内部,我指的是自动绑定在函数内部。

曾经的先人是这样解决问题的var that = this ,此后内部所有的this统一用that指代即可。


事情还没有结束,于是手贱的我干脆把function这个保留字换成箭头函数

let myObj={value:5};
myObj.double=()=>{
let that=this;
let helper=()=>{
console.log(that.value);
}
helper();
}
myObj.double(); // undefined
  • 以上说明,箭头函数中的this不是我们所想象的那般,此处待更。

于是乎,诞生出了新的undefined!!根据生物学实验中的对照法,我们要区别对照组和实验组,作为对照组的使用 function 保留字来做的已证是正确的,接下来看看我们的实验组

var value=88;
var myObj={value:5};
myObj.double=function(){
var helper=function(){
console.log(this.value); // undefined
console.log(this===global); // true
}
helper();
}
myObj.double();
console.log(global.value); //也就是说上方的value并不属于global

上面证明了什么呢??

  • 我们在node环境下,用 var 声明的变量并没有挂载在global对象中。 (那么它会挂载哪里?会挂载那个.js文件里面。那么怎么挂在node.js里面呢?此处待更
  • 当前文件中的this确实是指向全局对象的。与我们上文所说的JS机制还是一样的,只是环境不同的,还是那个尿性。
  • 经过尝试发现要这样写 global.value=4 是能够挂上去的

关于node中的global,箭头函数的this的一个小问题的更多相关文章

  1. js中this,箭头函数和普通函数

    四种基本用法 1. 一般方法中,this代指全局对象 window 2. 作为对象方法调用,this代指当前对象 3. 作为构造函数调用,this 指代new 出的对象 function test() ...

  2. JS中generater和箭头函数

    generater跟函数很像: function* fn(x){ yield x; yield x++; return x;} 如上所示,generater用function*定义,可以用yield返 ...

  3. node 中的global对象和process对象

    官方文档:http://nodejs.cn/api/ 因为Node.js是运行在服务区端的JavaScript环境,服务器程序和浏览器程序相比,最大的特点是没有浏览器的安全限制了,而且,服务器程序必须 ...

  4. es6中的双箭头函数

    原代码: const fetchPosts = subreddit => dispatch => { dispatch(requestPosts(subreddit)); return c ...

  5. ES6 箭头函数中的 this?你可能想多了(翻译)

    箭头函数=>无疑是ES6中最受关注的一个新特性了,通过它可以简写 function 函数表达式,你也可以在各种提及箭头函数的地方看到这样的观点——“=> 就是一个新的 function”. ...

  6. 普通函数跟箭头函数中this的指向问题

    箭头函数和普通函数的区别如下. 普通函数:根据调用我的人(谁调用我,我的this就指向谁) 箭头函数:根据所在的环境(我再哪个环境中,this就指向谁) 一针见血式总结: 普通函数中的this: 1. ...

  7. => js 中箭头函数使用总结

    箭头函数感性认识 箭头函数 是在es6 中添加的一种规范 x => x * x 相当于 function(x){return x*x} 箭头函数相当于 匿名函数, 简化了函数的定义. 语言的发展 ...

  8. ES6中箭头函数的作用

    我们知道在ES6中,引入了箭头函数,其本质就是等同有ES5中的函数.类似于下面的写法: let test1=() => “abc”; let test2=() => { return “a ...

  9. 箭头函数中的this和普通函数中的this对比

    ES6中新增了箭头函数这种语法,箭头函数以其简洁性和方便获取this的特性.下面来总结一下他们之间的区别: 普通函数下的this: 在普通函数中的this总是代表它的直接调用者,在默认情况下,this ...

随机推荐

  1. 【LeetCode】018 4Sum

    题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = ...

  2. “Hello World”—— 第一个汇编程序

    Hello World这是每一门编程语言的第一个最简单程序,下面那个程序就是汇编语言的Hello World.学汇编一段时间了,到现在才记录下自己的第一个汇编程序笔记.虽然这是个相当简单的小程序,但这 ...

  3. encodeURI,encodeURIComponent编码

    encodeURI().encodeURIComponent().decodeURI().decodeURIComponent() URL编码 Global对象的encodeURI()和encodeU ...

  4. 简单易懂dubbo入门实例

    一.创建Maven多模块项目 项目结构如下 模块介绍: dubbo-api            ----API接口 dubbo-consumer ----消费者 dubbo-provider     ...

  5. 【转】Unity3D如何制作落叶效果

    原文地址:http://hi.baidu.com/cupgenie/item/c23861df692f59e3b3f777a8 创建一个粒子系统 GameObject>Create other& ...

  6. SQL 常用语句收集

    1.UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 2.SELECT * FROM TableA INNER JOIN TableB ON TableA.name = T ...

  7. 【转】Pro Android学习笔记(五三):调试和分析(1):Debug视图和DDMS视图

    目录(?)[-] Debug视图 DDMS视图 查看应用运行状态 进入debug状态 HPROF Thread信息 Method信息 Stop 截图 UI层次架构信息 其它的 Tab中提供的功能 我们 ...

  8. Java变量初始化的讲解

    首先需要说明的是Java中的变量分为两种:成员变量和局部变量 其中成员变量又可分为:实例变量(非静态变量)和类变量(静态变量) 局部变量(局部变量的作用时间很短,所以一般是存储在栈中的): 1.形参在 ...

  9. == Equals ReferenceEquals 比较

    == 为操作符 ReferenceEquals和Equals为函数 ========================================================= Referenc ...

  10. Ubuntu 切换root用户是时出现su Authentication failure

    su root 时出现错误su Authentication failure 原因是没有给root用户设置密码 sudo passwd root