javascript中this只有函数执行时候才能确定到底指向谁,实际this最终指向是那个调用它的对象。

1,匿名函数中的this——window

function foo(){
var lastName = 'miya';
console.log(this.lastName); //undefined
console.log(this); //window
}
foo();

2,作为对象的方法的this

//作为对象方法
var obj = {
a:1,
getA: function(){
console.log( this === obj); //true
console.log(this.a) //
}
} obj.getA();

再看这个例子:

var o = {
a:10,
b:{
// a:12,
fn:function(){
console.log(this.a); //undefined
}
}
}
o.b.fn();

此时的this.a是undefined,原因是:尽管fn被最外层的o对象所调用,但是this指向的只是当前fn的上一级的对象,也就是b对象,b对象没有a属性,所以输出undefined。

再看另外一种比较特殊的this指向情况:

var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();

这个比较好理解:this指向的永远是最后调用它的对象,也就是函数执行时候的对象,很明显通过对象j去执行fn函数,j的this指向是window,而全局没有a属性,所以输出是undefined。

3,构造函数的this执行

function Fn(){
this.user = "miya";
}
var a = new Fn();
console.log(a.user); //miya

此时Fn构造函数中this指向是a对象,因为new关键字改变了this指向,a是Fn的实例,为什么new关键字会改变this指向,因为new一个实例时候是先创建了一个空对象,然后将原对象或原对象原型上的方法或属性copy一份到新对象上。所以this指向改变到新对象上面。

再来看个例子:

function fn(){
this.name = 'miya';
return {name:'Jone'};
}
var a = new fn();
console.log(a.name);

觉着是不是应该返回miya,但实际返回的是Jone;

function fn(){
this.name1 = 'miya';
return function(){};
}
var a = new fn();
console.log(a.name1); //undefined

此时,a instanceof fn    //false;表示a不是fn的实例了。

ES6中的class类的constructor中也有类似的例子:

class Foo {
constructor() {
return Object.create(null);
}
} new Foo() instanceof Foo
// false

ES6的class相当于ES5中的构造器函数,constructor方法默认返回实例对象this,但是如果返回全新的对象,那么实例就不是原类的实例了。

如果构造函数返回的是一个对象,那么this指向就是那个返回对象,但如果不是对象,this指向还是构造函数的实例。

function fn(){
this.name1 = 'miya';
return null;
}
var a = new fn();
console.log(a.name1); //miya
a instanceof fn //true

照理说null也是对象,但是此时this指向还是构造函数的实例对象,因为null比较特殊。

所以代码中:beforefn.apply( this, arguments );//this指向就是当前的beforefn,因为是beforefn在执行,所以this当然是beforefn了。

【完】

究竟什么是真理?———不可驳倒的谬误便是。                   —尼采

javascript中this指向的问题的更多相关文章

  1. 图解javascript中this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...

  2. 从零开始学习前端JAVASCRIPT — JavaScript中this指向的四种情况

    JavaScript中this的四种情况(非严格模式) 1.当this所在函数是事件处理函数时,this指向事件源.2.当this所在函数是构造函数时,this指向new出来的对象.3.this所在函 ...

  3. 关于javascript中this 指向的4种调用模式

    this指向问题绝对可以排js 的top 5最难和最重点的问题,初学者常常搞不清楚this指向哪里,特别是学过java和c#的人,想当年俺也迷糊了好久,直到遇到蝴蝶书,主要是因为js和主流的面向对象语 ...

  4. JavaScript中this指向的简单理解

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象(这句话有些问题,后面会解释为什么会有问题,虽然 ...

  5. javascript中this指向问题

    本文参考http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html this是JavaScript的一个关 ...

  6. javascript中this指向

    在简单函数中,this是指向当前对象,可用来获取当前对象某个属性,但随着函数变复杂,this很多情况不指向当前对象,而是指向window. 1.在独立调用函数中,具有全局执行环境,this指向wind ...

  7. javascript中constructor指向问题

    首先用一个例子指出来constructor存在形式. function Fruit(){ } var f=new Fruit(); console.log(f.constructor);//打印出Fr ...

  8. Javascript中的this指向。

    一.JavaScript中的函数 在了解this指向之前,要先弄明白函数执行时它的执行环境是如何创建的,这样可以更清楚的去理解JavaScript中的this指向. function fn(x,y,n ...

  9. 图解avaScript中this指向(超透彻)

    一个图讲清楚JavaScript中this指向: 说明: (1)严格模式下,禁止this关键字指向全局对象会报错. (2)闭包中的this对象具有全局性,因此通常指向window.  (3)优先级:n ...

随机推荐

  1. 项目部署篇之二——linux下安装jdk1.8

    1.下载jdk1.8 百度云下载后,直接通过xftp拖到你想放的目录下就行了,实在方便 链接:https://pan.baidu.com/s/1hQl0_3owT776lRO9mHSbXA 提取码:2 ...

  2. AttributeError: 'bytes' object has no attribute 'hex'

    python3.5之前bytes数据没有hex()属性 需要使用 ''.join(map(lambda x:('' if len(hex(x))>=4 else '/x0')+hex(x)[2: ...

  3. auth模块用法

    Auth模块: 如果你想用auth模块   那么你就用全套 createsuperuser  创建超级用户 这个超级用户就可以拥有登陆django admin后台管理的权限 Auth模块是Django ...

  4. 使用框架结构之frameset

    首先,我希望在你的目录下,有4个网页,各自显示不同的内容. 如图所示: 1.html显示"火影忍者" 2.html显示"英雄联盟" 3.html显示" ...

  5. Witness组件详解

  6. MOOC(7)- case依赖、读取json配置文件进行多个接口请求-完整的测试类,含依赖测试(15)

    ddt.依赖测试.断言.测试数据写回 # -*- coding: utf-8 -*- # @Time : 2020/2/12 23:07 # @File : test_class_15.py # @A ...

  7. SpringBoot连接Oracle报错,找不到驱动类,application.properties文件中驱动类路径为红色

    pom.xml文件: <!-- oracle odbc --> <dependency> <groupId>com.oracle</groupId> & ...

  8. Excel中带字母的数字序列自增实现方法

    示例: 在A1单元格输入以下公式,然后向下填充公式 =".mr"&ROW()&" {margin-right: "&ROW()& ...

  9. [洛谷P4782] [模板] 2-SAT 问题

    NOIp后第一篇题解. NOIp我考的很凉啊...... 题目传送门 之前讲过怎么判断2-SAT是否存在解. 至于如何构造一组解: 我们想到对tarjan缩点后的图进行拓扑排序. 那么对于代表0状态的 ...

  10. 数据库三大范式和反范式 · oldmee

    后一个范式都是在满足前一个范式的基础上建立的. 1NF 无重复的列.表中的每一列都是不可分割的基本数据项.不满足1NF的数据库不是关系数据库.如联系人表(姓名,电话),一个联系人有家庭电话和公司电话, ...