首页 > 其他分享 >【JS错题总结】关于上下文

【JS错题总结】关于上下文

时间:2023-06-15 20:45:34浏览次数:50  
标签:func1 setTimeout 函数 value JS 错题 myObject 上下文 hello

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    function func1() {
        console.log(1, this.value)
    }

    const myObject = {
        value: 'hello',

        func1: function(p1) {
            console.log(2, p1)
        },

        func2: function() {
            setTimeout(function() {
                this.func1(this.value) // 1 undefined
            }, 1)

            setTimeout(() => {
                this.func1(this.value) // 2 'hello'
            }, 10)

            setTimeout(() => {
                this.func1.apply(window, [this.value]) // 2 'hello'
            }, 100)

            setTimeout(function() {
                this.func1.apply(myObject) // 1 'hello'
            }, 100)
        }
    }

    myObject.func2()
</script>

</body>
</html>

第一个 setTimeout 中函数打印 1 undefined ,原因是 setTimeout 函数的回调是普通函数表达式

它没有绑定特定的上下文,因此在该回调函数内部,this 指向全局对象 window。由于全局对象 window 没有 value 属性,所以打印结果为 1 undefined

 

第二个 setTimeout 中函数打印 2 hello,原因是箭头函数继承了其外部作用域的 this 值,因此它使用了包含它的函数的上下文,即 myObject 对象。在这种情况下,this.value 的值为 hello,因此打印结果为 2  hello

 

第三个 setTimeout 中函数打印 2 hello,原因是使用了箭头函数后,调用的函数还是myObject.func1,传入的值还是 hello,只不过是将该函数和传入的值拿到最外层的上下文中执行

 

第四个 setTimeout 中函数打印 1 hello,原因是使用普通函数,没有绑定特定的上下文,此时的 this 指向的是最外层的上下文,调用的函数也是最外层的func1,所以会打印 1,但是通过 apply myObject,外层的 func1 函数中的 this.value 可以从 myObject 中拿到,所以会打印 hello

 

标签:func1,setTimeout,函数,value,JS,错题,myObject,上下文,hello
From: https://www.cnblogs.com/zjy4fun/p/17484066.html

相关文章

  • js中各种时间格式的相互切换
    js中各种时间格式的相互切换https://jingyan.baidu.com/article/d2b1d102aa60941d7e37d4fc.html前端开发中,往往需要使用到各种时间格式,包括中国标准时间,国际标准时间,时间戳,年月日的时间等,这么多种的时间格式,就需要相互转换,本文旨在介绍各种时间格式的转化方法。工具/原料Hbuilde......
  • Js基础入门
    [Js基础入门-掘金](https://juejin.cn/post/7244734132322992187)浏览器执行JS简介浏览器分成两大部分渲染引擎和JS引擎渲染引擎:用来解析HTML与CSS,俗称内核,比如chrome浏览器的blink,老版本的webkitJS引擎:也称为JS解释器。用来读取网页中的JavaScript代码,对其处理后......
  • JS收藏
    2、在HTML页面中显示分数,可用如下格式:½¾⅓===============================================functionisCharsInBag(s,bag){vari;for(i=0;i<s.length;i++){varc=s.charAt(i);if(bag.indexOf(c)==-1)returnfalse;}returntrue;......
  • javascript eval和JSON之间的联系
    本文着重解释eval函数和JSON数据格式之间的联系以及一些细节上的问题。如果您想详细了解eveval :https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Functions/EvalJSON:http://www.json.org/eval函数的工作原理eval函数会评估一个给定的含有JavaScr......
  • NodeJS系列(1)- 安装配置 NVM + NodeJS
    NodeJS(或Node.js) 是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。简而言之,NodeJS就是运行在服务端的JavaScript。NVM(NodeVersionManage),即NodeJS的版本管理工具。不同项目依赖不同的NodeJS版本......
  • 6月13日,OpenAI再给ChatGPT、GPT-4加码,API函数调用上线、上下文长度提高4倍、价格降低
    下面是是openAI官方发给用户的邮件内容: 英文不好需要翻译,之后的内容:    ~~~~~~~~~~可以忽略~~~~~~~~~~~~~发现一个不错的国内chatGPT网站,方便易用。点击直达......
  • 碎片化学习前端之JavaScript(JS 压缩图片)
    前言图片压缩是前端开发中常见的需求,目前前端主流的解决方案有:Canvas手动实现压缩以及第三方库压缩两种方案。Canvas手动实现压缩Canvas实现压缩主要原理是:将图片绘制到canvas上,然后通过调整canvas的宽高来实现压缩。functioncompressImage(file,maxWidth,maxHeight......
  • Compile Unity jslib in command
    CompileUnityjslibincommand(JinQing’sColumn,May.,2023)MyUnityprojecthasajslibfile,whichhasmanysyntaxerrors.ButUnitydoesnotreportthesejsliberrorslikecsfiles,untiltheWebGLbuildfailswithaerrorlikethis:Failedprocessstd......
  • Linux安装nodejs
    cd/opt/softwgethttps://cdn.npmmirror.com/binaries/node/v16.15.1/node-v16.15.1-linux-x64.tar.xztar-xvfnode-v16.15.1-linux-x64.tar.xzmvnode-v16.15.1-linux-x64nodejs-v16.15#建立软连接ln-s/opt/soft/nodejs-v16.15/bin/node/usr/bin/nodeln-s/o......
  • npm publish 发包报错npm ERR! 403 403 Forbidden - PUT https://registry.npmjs.org/
    如果出现在发布的时候报这个错,说明你在package.json中登记的name已近被采用了。重名了,所以你得换一个。我们在发布一个包之前,最好拿着这个登记的name去搜一下,如果已近有了,那就要换一个。......