规律1:函数用圆括号调用,函数的上下文是window对象

比如小题目:

function fun(){

var a = 888;

alert(this.a); //实际上访问的是window.a

}

var a = 666;

fun(); //弹出666

函数function fun(){}的上下文是什么!不要看它怎么定义,要看它怎么调用!!此时是fun()函数名加上圆括号直接调用,此时上下文就是window对象!

而我们知道:所有的全局变量都是window对象的属性,(注意:函数里面的局部变量,不是window的属性,不是任何东西的属性,它就是一个变量!!) 程序弹出666.

规律2:函数如果作为一个对象的方法,对象打点调用,函数的上下文就是这个对象

比如下面的例子,我们把fun函数定义出来了,然后又把这个函数绑定给了obj对象的c属性:

function fun(){

alert(this.a); //相当于弹出obj.a

}

//对象

var obj = {

"a" : 10,

"b" : 20,

//给这个对象增加一个方法,值就是fun函数

"c" : fun

}

//我们要看清楚函数执行的时候,是怎么执行的!!

//现在不是圆括号直接执行!!而是一个对象打点调用这个函数执行,所以函数的上下文是obj对象!!!

obj.c(); //弹出10

调用的时候,是

对象.函数()

此时根据规律,函数里面的this是这个对象。所以能够弹出10。

规律3:函数是事件处理函数,函数的上下文就是触发这个事件的对象

下面我们定义了一个fun,然后把这个fun当做了3个DOM元素的事件处理函数:

//函数

function fun(){

this.style.background = "red";

}

var box1 = document.getElementById("box1");

var box2 = document.getElementById("box2");

var box3 = document.getElementById("box3");

// 把同一个函数绑定给不同的对象

// this就是点击谁就是谁

box1.onclick = fun;

box2.onclick = fun;

box3.onclick = fun;

函数不会执行,直到用户点击了某一个div标签。此时点击谁,this就是谁。

规律4:定时器调用函数,上下文是window对象

//函数

function fun(){

alert(this.a);

}

var a = 888;

setInterval(fun,1000);

函数fun被定时器调用,此时函数的上下文就是window对象。每秒钟能弹出888.

做一个小例子吧,点击一个盒子,2秒钟之后变红:

小明同学写的程序是错误的:

var box1 = document.getElementById("box1");

box1.onclick = function(){

setTimeout(function(){

this.style.background = "red";

},2000);

}

这是因为我标蓝色的函数的最终调用者是定时器!所以函数的上下文是window对象。window对象没有背景颜色属性。

怎么办?备份this!备份上下文!

在定时器外面的事件处理函数中,this就是box1这个元素,此时我们可以备份上下文。把this存为局部变量self,后面的程序就用self指代box1。还可以用_this、that等等,我们一律使用self。

var box1 = document.getElementById("box1");

box1.onclick = function(){

var self = this;

setTimeout(function(){

self.style.background = "red";

},2000);

}

规律5:数组中存放的函数,被数组索引之后加圆括号调用,this就是这个数组

比如:

function fun(){

alert(this === arr); //true

alert(this.length); //3,因为数组的长度是3

}

var arr = [fun,"东风","五条"];

arr[0]();

一定要敏感:

arr[0]();

此时这个函数是从数组中枚举出来然后加圆括号执行的,所以最终调用者可以认为是这个数组,上下文就是这个数组。

函数的上下文就是函数里面的this是谁的更多相关文章

  1. javascript 函数执行上下文

    在js里,每个函数都有一个执行的上下文,我们可以通过this来访问. 如: 全局函数 function test(){ var local = this; } 我们发现local等于window(do ...

  2. this泛指函数的上下文

    this泛指函数的上下文 当前函数运行的类型上下文.

  3. PHP---------PHP函数里面的static静态变量

    工作一年了,一年里很少用到static这个关键词,不管是类里面还是方法里面基本都没怎么用过.平时看到类里面有这个都没什么好奇的,今天在函数里面看到了这个,就去百度了一下. <?phpfuncti ...

  4. 学习hash_map从而了解如何写stl里面的hash函数和equal或者compare函数

    ---恢复内容开始--- 看到同事用unordered_map了所以找个帖子学习学习 http://blog.sina.com.cn/s/blog_4c98b9600100audq.html (一)为 ...

  5. ajax实现注册用户名时动态显示用户名是否已经被注册(1、ajax可以实现我们常见的注册用户名动态判断)(2、jquery里面的ajax也是类似我们这样封装了的函数)

    ajax实现注册用户名时动态显示用户名是否已经被注册(1.ajax可以实现我们常见的注册用户名动态判断)(2.jquery里面的ajax也是类似我们这样封装了的函数) 一.总结 1.ajax可以实现我 ...

  6. c里面的static inline函数

    一般来说加上static表示函数是文件作用域,有的时候单独使用inline编译器会优化,没有编译成内联函数,而是变成普通函数编译,所以必须在前面加上static,放在头文件中可以被外部文件访问.   ...

  7. 深入理解JavaScript执行上下文、函数堆栈、提升的概念

    本文内容主要转载自以下两位作者的文章,如有侵权请联系我删除: https://feclub.cn/post/content/ec_ecs_hosting http://blog.csdn.net/hi ...

  8. 通俗易懂的来讲讲js的函数执行上下文

    0.开场白 在平时编写JavaScript代码时,我们并不会和执行上下文直接接触,但是想要彻底搞懂JavaScript函数的话,执行上下文是我们绕不过去的一个知识点. 1.执行上下文栈 JavaScr ...

  9. Java函数式编程:二、高阶函数,闭包,函数组合以及柯里化

    承接上文:Java函数式编程:一.函数式接口,lambda表达式和方法引用 这次来聊聊函数式编程中其他的几个比较重要的概念和技术,从而使得我们能更深刻的掌握Java中的函数式编程. 本篇博客主要聊聊以 ...

随机推荐

  1. 无锁模式的Vector

    这两天学习无锁的并发模式,发现相比于传统的 同步加锁相比,有两点好处1.无锁 模式 相比于 传统的 同步加锁  提高了性能 2.无锁模式 是天然的死锁免疫 下来介绍无锁的Vector--- LockF ...

  2. 面试(1)-java-se-字符串

    http://blog.csdn.net/zhangerqing/article/details/8093919 hashCode和identityHashCode的区别 I. hashCode()方 ...

  3. 《一起》Alpha版软件使用说明

    1.引言 1.1编写目的 本手册是软件工程概论团队项目<一起>的Alpha版使用说明,面向的对象群体为全校师生. 1.2项目背景 本项目由<软件工程概论>课程需求创建,软件由S ...

  4. css实现梯形(各种形状)的网页布局——transform的妙用

    在各式各样的网页中,经常会看到形状特别的布局,比如说下面的这种排版方式: 这种视觉上的效果,体验十分好.那么他是如何来实现的呢,博主在这里整理了如下2种实现的方式. 1.通过给 div 加border ...

  5. sublime 新手代码提示

    有提示的    你按   table   试试这就是按过的结果   是不是很方便这是按后的效果      是不是很方便 下面是各种简写效果html <html></html> ...

  6. JavaScript之语句,循环

    JavaScript中语句主要分为三类:顺序,分支,循环. 1.顺序语句: 按照循序依次执行,最普通常见的语句,这里不多赘述. 其结构如下 2.分支语句: 根据条件判断,不同的结果执行不同的语句. 其 ...

  7. MySql数据库基础操作——数据库、用户的创建,表的制作、修改等

    MySql 是一款使用便捷.轻量级的数据库.因为他体积小.速度快.安装使用简单.开源等优点,目前是使用最广泛的数据库.目前位于Oracle甲骨文公司旗下.那今天我们就来介绍一下数据库的基本操作.具体介 ...

  8. Spring Security3详细配置

    Spring Security3详细配置 表名:RESOURCE 解释:资源表备注: 资源表 RESOURCE(资源表) 是否主键 字段名 字段描述 数据类型 长度 可空 约束 缺省值 备注 是 ID ...

  9. flask 扩展之 -- flask-moment

    一. 安装 $ pip install flask-moment 二. 初始化 from flask_moment import Moment moment = Moment(app) 三. 解决依赖 ...

  10. CSS3 @keyframes 规则

    今天来给大家分享一下CSS3 @keyframes 规则! 在你了解CSS3 @keyframes 规则时我先来给大家说说什么是css3中的动画 动画是使元素从一种样式逐渐变化为另一种样式的效果. 您 ...