'use strict';
var a = 20;
function foo () {
var a = 1;
var obj = {
a: 10,
c: this.a + 20,
fn: function () {
return this.a;
}
}
return obj.c; }
console.log(foo()); // ?
console.log(window.foo()); // ?

首先明确一点, 一个函数如果独立调用, 比如直接 foo(), this在严格模式下是 undefined , 在非严格模式下会自动转向到window

第二点就是 在进入新的函数作用域, this才会发生改变;

所以执行 foo() 会报错, this未定义;

如果在非严格模式下, this.a 就是window.a  = 20 , 虽然obj是调用者,  但 this.a + 20 不在一个函数体中,  执行 obj.c的时候

并没有创建新的作用域, 所以this没有发生改变, 依然执行window

第三点是 谁调用函数, this会指向谁, 并且调用后要立即执行;

执行 window.foo,  this.a为20;

var a = 20;
var foo = {
a: 10,
getA: function () {
return this.a;
}
}
console.log(foo.getA()); // var test = foo.getA;
console.log(test()); //

foo.getA()中,getA是调用者,他不是独立调用,被对象foo所拥有,因此它的this指向了foo。

test()作为调用者,尽管他与foo.getA的引用相同,但是它是独立调用的,

因此this指向undefined,在非严格模式,自动转向全局window。

function foo() {
console.log(this.a)
} function active(fn) {
fn(); // 真实调用者,为独立调用
} var a = 20;
var obj = {
a: 10,
getA: foo
} active(obj.getA); //20

这个列子也一样, fn真正执行的时候,  其实obj并没有调用getA;  只是引用相同而已。

this 指向问题, 三个例子的更多相关文章

  1. css通用小笔记02——浮动、清除(三个例子)

    css中通常会用到浮动与清除,也是一个必须掌握的知识点,概念性的东西不多说,下面举几个例子,来说明它的用法:1.文字环绕效果  2.多个div并排显示 3.清除浮动(默认显示) 一.文字环绕效果: h ...

  2. 统计学习方法笔记--EM算法--三硬币例子补充

    本文,意在说明<统计学习方法>第九章EM算法的三硬币例子,公式(9.5-9.6如何而来) 下面是(公式9.5-9.8)的说明, 本人水平有限,怀着分享学习的态度发表此文,欢迎大家批评,交流 ...

  3. keras神经网络三个例子

    keras构造神经网络,非常之方便!以后就它了.本文给出了三个例子,都是普通的神经网络 例一.离散输出,单标签.多分类 例二.图像识别,单标签.多分类.没有用到卷积神经网络(CNN) 例三.时序预测, ...

  4. golang关键字select的三个例子, time.After模拟socket/心跳超时

    golang关键字select的三个例子, time.After模拟socket/心跳超时   例子1 select会随机选择一个可执行的case   // 这个例子主要说明select是随机选择一个 ...

  5. 改变javascript函数内部this指针指向的三种方法

    在查了大量的资料后,我总结了下面的三条规则,这三条规则,已经可以解决目前我所遇到的所有问题.规则0:函数本身是一个特殊类型,大多数时候,可以认为是一个变量. function a() { alert( ...

  6. TControl的显示函数(5个非虚函数,4个虚函数)和三个例子的执行过程(包括SetParent的例子)

    // 9个显示函数 procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual; // 虚函数,important 根据父控 ...

  7. Flask--第三个例子,写一个接口,该接口返回html前端页面,模板的使用

     将接口数据返回至html前端页面有两种方法 方法一: 1 @app.route('/index',methods=['get']) 2 def open_index(): 3 page=open(' ...

  8. js中this指向的三种情况

    js中this指向的几种情况一.全局作用域或者普通函数自执行中this指向全局对象window,普通函数的自执行会进行预编译,然后预编译this的指向是window //全局作用域 console.l ...

  9. ES5中改变this指向的三种方法

    ES5中提供了三种改变函数中this指针指向的方法,分别如下 1.call() var obj = {username:"孙悟空"}; //没有任何修饰的调用函数,函数中的this ...

随机推荐

  1. Red and Black HDU - 1312

    There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A ...

  2. fiddler 显示server ip

    Fiddler显示服务器ip地址列(方便查看host是否生效) 2016年08月31日 15:40:10 阅读数:5801 1.点击菜单栏rules——customize rules... 2.ctr ...

  3. 【IDEA】【7】Git更新及提交

    如果是Git管理的项目,顶部会出现这样的按钮 绿色代表commit到本地 蓝色代表update最新代码 Push:推送到远程服务器:右键项目->Git->Repository->Pu ...

  4. PyCharm + PyQt4 环境搭建

    一.准备工作 下载pycharm 和 pyqt4 (百度下就有) pyqt4安装好后,在C:\Python27\Lib\site-packages\PyQt4 路径下会有designer.exe ,这 ...

  5. nodejs 解析excel文件

    app.js: var FileUpload = require('express-fileupload') app.use(FileUpload()); service.js: npm instal ...

  6. CentOS 7使用yum安装SNMP教程

    一.安装SMNP yum install -y net-snmp net-snmp-utils 可以理解为net-snmp是服务端,net-snmp-utils是客户端工具集:如果机器上只需要搭建服务 ...

  7. python格式化日期

    #!/usr/bin/python # -*- coding: UTF-8 -*- import time import calendar """ 时间元组(年.月.日. ...

  8. 给div添加锚点

    <div class="col-xs-3" id="myScrollspy"> <ul class="nav nav-tabs na ...

  9. win7下使用U盘安装双系统(Ubuntu-17)

    1.首先下载Ubuntu镜像文件,下载地址:http://mirrors.neusoft.edu.cn/ 2.下载 U盘操作系统安装工具- Universal USB Installer ,下载地址: ...

  10. Linux command nmon

    Linux command nmon [Purpose]        Learning linux command nmon   [Eevironment]        Ubuntu 16.04 ...