首页 > 其他分享 >立即执行函数的this指向是window(非严格模式下)

立即执行函数的this指向是window(非严格模式下)

时间:2023-11-08 14:22:40浏览次数:37  
标签:function 函数 指向 cb 117 len window func

请问以下JS代码最后输出的len值是多少?

var len = 117;
let func = {
  len: 935,
  showLen: function() {
    console.log(this.len);
  },
  show: function() {
    (function(cb) {
      cb();
    })(this.showLen)
  }
}
func.show();

正确答案 117

立即执行函数的this指向是window(非严格模式下),
因为作为一个匿名函数,在被调用的时候,我们往往就是直接调用,因此它的this是非常确定的,那么len就取window下的len值了即117。

// 在JavaScript的函数中,this始终指向调用者的上下文环境
var len = 117 // 5. 全局作用域中使用 var 定义的变量默认会成为 window 的属性,及 window.len
let func = {
  len: 935,
  showLen: function () {
    console.log(this.len) // 4. this 此时指向的是 window,所以相当于打印 window.len
  },
  show: function () {
    (function (cb) {
      cb() // 3. cb 相当于 cb.call() 默认没有传入上下文环境时 this 指向全局的 window 对象
    })(this.showLen) // 2. this 是 func 所以传入的是上面定义的 showLen 函数
  }
}

func.show() // 1. 相当于 func.show.call(func),此时 this 是 func

var len=117;我们可以发现这个是用var声明的,属于全局变量,所以打印的结果为117;
若将var改为let,则打印的结果为undefined
因为let声明的全局变量不会挂载到window下面,但var会

函数只要不是new出来的,内部this指向都是window,其他的this指当前块

在非严格模式下,独立函数调用内部this都执行window, 函数直接调用,即没有打点调用或者作为构造函数调用,this指向window,和是不是立即执行函数没有关系。不信执行下面的代码。

var len = 117;
let func = {
 len: 935,
 showLen: function() {
   console.log(this.len);
 },
 show: function() {
   const f = function(cb) {
     cb();
   }
   f(this.showLen)
 }
}
func.show();

结果也是117

标签:function,函数,指向,cb,117,len,window,func
From: https://www.cnblogs.com/longmo666/p/17817301.html

相关文章

  • 无涯教程-批处理 - String length函数
    在DOS脚本中,没有定义用于查找字符串长度的长度函数,有一些自定义函数可用于相同的功能,以下是一个自定义函数的示例,用于查看字符串的长度。@echooffsetstr=HelloWorldcall:strLenstrstrlenechoStringis%strlen%characterslongexit/b:strLensetlocalenablede......
  • 无涯教程-批处理 - String Interpolation函数
    在DOS脚本中,可以使用set命令完成字符串插值,并在使用set命令时将数字定义的变量或任何其他文字排成一行。以下示例显示了如何也可以使用数字值进行字符串插值。@echooffSETa=HelloSETb=LearnfkSET/Ad=50SETc=%a%and%b%%d%echo%c%上面的命令产生以下输出。H......
  • 使用Sysprep封装Windows
    前言:首先感谢前同事的经验教程分享,结合自己实际情况,再进行以下的归纳总结。封装过程不介入第三方工具,不做任何优化。序号任务1安装系统,软件2封装系统3捕获ISO,生成win文件4注入ISO5利用Ventoy制作U盘启动盘              ......
  • Excel统计函数中比较常用的函数
    StatisticalfunctionsStatisticalfunctionsAVEDEVReturnstheaverageoftheabsolutedeviationsofdatapointsfromtheirmeanAVERAGEReturnstheaverageofitsargumentsAVERAGEAReturnstheaverageofitsarguments,includingnumbers,text,andlogica......
  • C语言程序设计 练习题参考答案 第五章 (1) 函数定义调用
    /*5.6编写函数,输出所有水仙花数*/#include"stdio.h"intisdaffodil(intn);/*isdaffodil函数原型声明*/voidmain(){inti;for(i=100;i<=999;i++)if(isdaffodil(i))printf("%5d",i);}intisdaffodil(intn)/*is......
  • C语言程序设计 练习题参考答案 第五章 (2) 递归函数
    /*5.10编写函数,求Fibonacci数列的第n项*/#include"stdio.h"intfibonacci(intn);voidmain(){intn;printf("求Fibonacci数列的第n项,请输入n\n");scanf("%d",&n);/*VC6中n要小于?*/printf("Fibonacci数列的第%d项为%d",n,......
  • C语言程序设计 随机函数的使用-随机点名做习题
    /*---------------------------------------随机点名做习题Author:emanleeDate:2008-04-24---------------------------------------*/#include"stdio.h"#include"conio.h"#include"time.h"voidmain(){intcount=4......
  • C语言程序设计 求阶乘递归函数调用示例
    ......
  • C语言程序设计 练习题参考答案 第七章 (2) 指针与数组 main函数形参
    /*7.16实现测试字符串长度函数strlen()*/#include"stdio.h"intstrlen(char*p);voidmain(){chars1[20]="s1s2s3s4";char*p=s1;printf("s1的长度:%d\n",strlen(s1));printf("s1的长度:%d\n",strlen(p));......
  • C语言程序设计 文件操作函数
    文件操作函数C语言(FILEfputcfgetcfputsfgetsfscanffprintf)在ANSIC中,对文件的操作分为两种方式,即流式文件操作和I/O文件操作,下面就分别介绍之。一、流式文件操作这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下:typedefstruct{intlevel;/*fill/empt......