js中的this指向

js中的this指向

首先,js中的this指向是根据运行时确定的,而非定义时。

js中的this指向大致分为如下几种:

  • 作为对象的方法调用
  • 作为普通函数调用
  • 构造调用
  • call、apply调用

作为对象的方法调用

var obj = {
  a: 1,
  getA: function(){
    alert ( this === obj ); // true
    alert ( this.a ); // 1
  }
};
obj.getA();

作为普通函数调用(浏览器环境)

window.name = 'globalName';
var getName = function(){
  return this.name;
};
console.log( getName() ); // globalName

或者

window.name = 'globalName';
var myObject = {
  name: 'sven',
  getName: function(){
    return this.name;
  }
};
var getName = myObject.getName;
console.log( getName() ); // globalName

构造调用

var MyClass = function(){
  this.name = 'sven';
};
var obj = new MyClass();
alert ( obj.name ); // sven

一般情况下,构造调用时this指向new后的对象,但是有种比较特殊,就是当构造函数return一个对象时(必须是对象,其余类型比如string请忽略)指向该对象。

var MyClass = function(){
  this.name = 'sven';
  return {
  name: 'anne'
  }
};
var obj = new MyClass();
alert ( obj.name ); // anne

返回一个普通字串:

var MyClass = function(){
  this.name = 'sven'
  return 'anne';
};
var obj = new MyClass();
alert ( obj.name ); // sven

call、apply调用

call、apply、bind可以人为改变function的this指向:

var obj1 = {
  name: 'sven',
  getName: function(){
    return this.name;
  }
};
var obj2 = {
  name: 'anne'
};
console.log( obj1.getName() ); // sven
console.log( obj1.getName.call( obj2 ) ); // anne

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我爱编程

Day18内建模块collections&base64collectionsbase64

collections collections是Python内建的一个集合模块,提供了许多有用的集合类。 namedtuple >>> from collect...

4258
来自专栏行者常至

(16)Struts2_OGNL读取Map栈及其他字段和方法属性

613
来自专栏偏前端工程师的驿站

(cljs/run-at (->JSVM :browser) "语言基础")

前言  两年多前知道cljs的存在时十分兴奋,但因为工作中根本用不上,国内也没有专门的职位于是搁置了对其的探索。而近一两年来又刮起了函数式编程的风潮,恰逢有幸主...

2217
来自专栏Felix的技术分享

霍夫曼压缩算法

3358
来自专栏cmazxiaoma的架构师之路

你应该会的一道多线程笔试题

2853
来自专栏技术博客

编写高质量代码改善C#程序的157个建议[动态数组、循环遍历、对象集合初始化]

    软件开发过程中,不可避免会用到集合,C#中的集合表现为数组和若干集合类。不管是数组还是集合类,它们都有各自的优缺点。如何使用好集合是我们在开发过程中必须...

1384
来自专栏calmound

sprintf的用法

在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者...

3476
来自专栏Code_iOS

Objective-c 知识总结 -- 继承

观察发现,它们属性和方法声明是相同的,都有 填充色(fillcolor)、尺寸+位置(bounds)、绘制方法;

1281
来自专栏陈满iOS

iOS基础·属性的修饰词与setter的关系

可以自己手动为实例变量在头文件 中声明setter、getter方法,并在实现文件中实现setter、getter方法。你也可以不声明不实现,但不要再企图调用s...

1702
来自专栏诸葛青云的专栏

C语言位运算的妙用你知道多少?

位运算在驱动开发中是经常遇到的,尤其是置0和置1。既要指定的位数发生变化,又不能改变其它位的值,还要高效率的编写代码,这时候技巧就很重要了。在位运算中有几个符号...

1864

扫码关注云+社区

领取腾讯云代金券