js闭包中的this(匿名函数中的this指向的是windows)

1.普通函数中的this指向的是对象,匿名函数中的this指向的是windows,和全局变量一样

2.让匿名函数中的this指向对象的两种方法

可以使用对象冒充强制改变this:call()、apply()

       将this赋值给一个变量,闭包可以访问这个变量

一、this问题

匿名函数的执行环境具有全局性,因此其this对象通常指向window(当然,在通过call()或者apply()改变函数执行环境的情况下,this就会指向其他对象)

为什么匿名函数没有取得其包含作用域(或外部作用域)的this对象呢?

每个函数在被调用时都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。

二、解决方法

(1)把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了。

2 可以使用对象冒充强制改变this:call()、apply()

原文地址:https://www.cnblogs.com/psxiao/p/11378681.html

时间: 2024-11-07 11:13:38

js闭包中的this(匿名函数中的this指向的是windows)的相关文章

通过取父级for循环的i来理解闭包,iife,匿名函数

在使用for循环的时候,假如需要在循环体中添加一个匿名函数处理其他的事情,那么,在这个匿名函数内,如果需要用到对应的i,因为闭包的缘故,循环体循环结束后才返回i,所以i最终为最后一次++的数值. 闭包即函数有权访问另一函数的局部变量,常用方法为在函数内部创建另一个需要引用这个函数内部变量的函数. 解决方式1 通过匿名函数传参,因为匿名函数取得参数是每次for循环里的i,所以每次打印的值为0,1,2,...... 匿名函数自我执行的方法是,在函数体外套一对圆括号,形成一个表达式,在圆括号后再加另一

C++ 中获取 可变形参函数中的参数

#include <iostream> #include <stdarg.h> using namespace std; int ArgFunc(const char * str, ...) { va_list ap; // 定义参数列表变量 va_start(ap, str); // 确定参数位置,表明从 str 开始获取参数 // 开始获取参数 var_arg(ap, 数据类型) 返回获取的值 cout<<va_arg(ap, int)<<endl; c

HTML代码中在两个匿名函数中使用同名变量出现bug而引起的变量作用域的思考

在学习HTML的时候,为了方便地对同一个css样式的不同值的效果进行对比,我做成了下面这个样子. 代码也是很典型的用于展示的格式(p元素的内容随便写的): 1 <head> 2 <style> 3 p{ 4 border: medium solid black; 5 padding: 5px; 6 margin: 5px; 7 text-justify:inter-word; 8 } 9 button{ 10 margin: 5px; 11 } 12 </style>

php 在 匿名函数中 调用自身。。

//php闭包实现函数的自调用,也就是实现递归 function closure($n,$counter,$max){ //匿名函数,这里函数的参数加&符号是,引址调用参数自己 $fn = function (&$n,&$counter,&$max=1) use(&$fn){//use参数传递的是函数闭包函数自身 $n++; if($n < $max){//递归点,也就是递归的条件 $counter .=$n.'<br />'; //递归调用自己

C#中委托,匿名函数,lamda表达式复习

一.委托 1.就给类比较,类用class声明,委托用delegate声明. 2.委托要指向一个真正的方法. 3.委托的签名,要和指向的方法一样. //1.声明一个委托 public delegate void DelSayHi(string name); public static void SayHiChinese(string name) { Console.WriteLine("你好?" + name); } public static void SayHiEnglish(str

JS常用的三种匿名函数

第一种: var f1=function(p1,p2){ return p1+p2; };//将函数赋值给一个变量 alert(f1(1,3)); 匿名函数没法调用,只能赋值给一个变量,由于是赋值语句,后面要加分号 应用: ///document.getElementById(‘btn’).onclick=function(){} 第二种(*): (function(p1,p2){alert(p1+p2);})(20,30); 直接声明一个匿名函数,立即使用.用匿名函数省得定义一个用一次就不用的

python中print()函数的“,”与java中System.out.print()函数中的“+”

python中的print()函数和java中的System.out.print()函数都有着打印字符串的功能. python中: print("hello,world!") 输出结果为:hello,world! java中: System.out.print("hello,world!"); 输出结果为:hello,world! 我们可以看到,这两个函数的用法是一样的 print()函数还有这种用法: print("1+1=",1+1) 输出结

vue中this在回调函数中的使用

this在各类回调中使用: 如果是普通函数是没法使用的 所以需要先将this.变量赋值给新的变量,然后才能在回调函数中使用 例如: refund: function (id) { if (!this.url.refund) { this.$message.error("请设置url.refund属性!") return } var that = this; this.$confirm({ title: "确认退款", content: "是否要进行退款?&

js 如何移除一个匿名函数的绑定事件

大家都知道 addEventListener的用法 绑定事件 例如 element.addEventListener(type,handler,false); element是dom元素 type是事件比如click handler 是一个函数表达式,false 代表是冒泡阶段 true是捕获阶段 如果移除事件的话 这样写: element.removeEventListener(type,handler); 如果handler是个匿名函数呢 比如 element.addEventListene