函数的上下文就是函数里面的this是谁

规律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]();

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

时间: 2024-08-08 01:16:02

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

声明函数 执行上下文 匿名函数

方法一: var foo = function () { //code } 方法二: function foo () { //code } 方法一:foo在进入函数执行上下文开始执行代码的时候,foo是undefined的,执行完var foo = function () { }这句,foo才会得到赋值: 方法二:在进入函数执行上下文开始执行代码的时候,foo已经是一个function了. 一旦进入执行上下文(在执行代码之前),VO(变量对象)就会被一些属性填充: 函数的形参(当进入函数执行上下

将javascript函数写在Html标签里

有些时候不想把函数写在script标签里了,想直接在html标签里直接加上js代码,可以这样写: <body > 如果是写在script标签里的话就是: <script> function tiao(){ window.location.href="http://www.speedtest.cn/" } </script> <body > 在这种情况下,第一种方法就简单点了.

dojo框架用hitch实现函数与上下文的绑定

dojo框架:http://dojotoolkit.org/ <!DOCTYPE html> <html> <head>     <meta charset="UTF-8">     <title>dojo框架绑定函数与上下文</title>     <script  src = "dojo/dojo/dojo.js"  ></script> </head>

url_for()中的坑,url_for操作对象是函数,而不是route里的路径

url_for操作对象是函数,而不是route里的路径. url_for操作对象是函数,而不是route里的路径. url_for操作对象是函数,而不是route里的路径.

python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化

函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面的冒号必不可少 函数体相对于def关键字必须保持一定的空格缩进 Python允许嵌套定义函数 在定义函数时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助. Python是一种高级动态编程语言,变量类型是随时可以改变的.Python中的函数和自定

278 执行上下文、执行上下文栈:变量提升与函数提升,执行上下文,执行上下文栈,全局执行上下文,函数执行上下文,练习题

变量提升与函数提升 变量提升: 在变量定义语句之前, 就可以访问到这个变量(undefined) 函数提升: 在函数定义语句之前, 就执行该函数 先有变量提升, 再有函数提升 变量声明提升.函数声明提升 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>01_变量声明提升.函数声明提升</title> &l

一个基础的问题 多个$(function(){})里面的函数 为什么在下一个$(function(){})里没法执行。

先看下例子 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="jquery-1.10.2_d88366fd.js"></script> </head> <body> <script> $(function(){ functi

gdb 和 addr2line 调试 crash(包含如何调试so里面的crash)

嵌入式编程中会遇到各种crash的问题. 对于这样的问题,有两种调试方法: addr2line  和 gdb. 第一章   先讲解下gcc 编译加不加 -g 对程序的影响, 还有strip. //1.1.cpp #include <iostream> using namespace std; bool IsUnique() {         int k = 0, m = 0;         k = k/m;      //这里会crash         return true; } in

Javascript 自动执行函数(立即调用函数)

开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声明变量和function有可能只在该function内部,这个上下文,在调用function的时候,提供一些简单的方式来创建自由变量或私有子function. eg: // 由于该function里返回了另外一个function,其中这个function可以访问自由变量i // 所有说,这个内部的f