首页 > 编程语言 >非严格模式下JavaScript语句中“this”默认指向全局对象(window)

非严格模式下JavaScript语句中“this”默认指向全局对象(window)

时间:2023-11-08 15:33:35浏览次数:35  
标签:语句 obj log 指向 JavaScript window call console

请阅读以下代码

var obj = {};
obj.log = console.log;
obj.log.call(console,this);

该代码在浏览器中执行,输出的日志结果是什么?

obj.log.call(console,this) = console.log(this)。

this这里指window,所以最后的表达式是 console.log(window)

这道题看似在考this的绑定问题,实际上是通过this绑定为幌子,考察非严格模式下JavaScript语句中“this”默认指向全局对象(window)。

题目的关键点在第3行,我们知道,this绑定的优先级是new>bind>call(apply)>obj.func()>默认绑定。也就是说obj.log.call(console, this)语句中,实际上log函数内的this实际上指代的是console(这也是本题最大的陷阱!)。
然而实际上这一语句中obj.log.call(console, this)这一语句中打印的this是在外部传进去的,和函数内的this对象根本没有关系!也就是说此时log函数内的this指代console,但是打印的是从外面传进去的this对象,也就是window!

为了证明这一点,读者朋友们可以把obj.log.call(console, this)中的console改成任意一个对象,然后在非严格模式下执行,会发现结果都是window。

非严格模式下JavaScript语句中“this”默认指向全局对象(window)。其实严格模式下上面代码也是指向全局对象(window),只是在普通函数内部的this才不会指向window。
function goodboy(){console.log(this);}
goodboy();
这种情况下的this才会受"use strict"的干扰

obj.log和console.log指向同一个函数, 使用obj.log.call(console)其实就是调用console.log()。 console.log(message)接受参数message并打印 obj.log.call(console, this)与console.log(this)相同,而在全局作用域下这个this为window!

全局执行环境中this 都指向全局对象;

在函数内部,this的值取决于函数被调用的方式。

let obj = {}
// example1
function fn(e){
console.log('传参',e) // 传参 window{}
console.log('内部',this) // 内部 {}
}
fn.call(obj, this)

// example2
let o = {
foo:function(){
function fn(e){
console.log('传参',e) // 传参 {foo: ƒ}
console.log('内部',this) // 内部 {}
}
fn.call(obj,this)
}
}
o.foo()
fn(e){}

1、this作为参数传入fn执行时取决于当前执行函数的执行上下文

2、fn函数内部的this才受call绑定影响。

obj.log = console.log

obj.log.call(console,this)等于console.log.call(console,this)等于console.log(this)

关于这个this的指向问题,我一开始以为是console,但是出来的结果是Window,可以尝试通过下面的代码理解

function test(mingzi){
this.name = mingzi;
this.check = function(){
console.log(this);
}
}

new test('小明').check();

上文中的代码通过check方法执行console.log(this),输出的是当前对象test,那么如果在JS中直接输出this呢?
这个this指向的对象是什么呢?答案就是Window。使用chrome的同学可以尝试在F12 console里面直接输入this,指向的正是Window

标签:语句,obj,log,指向,JavaScript,window,call,console
From: https://www.cnblogs.com/longmo666/p/17817514.html

相关文章

  • JavaScript权威基础语法教程讲解大全
    JavaScriptJS基础权威语法教程讲解大全https://developer.mozilla.org/zh-CN/docs/Web/JavaScript参考、来源:《爬虫7期:爬虫&逆向7期-第1章-爬虫&逆向7期-1.32-javascript入门_02.mp4》2:28:40......
  • 函数如果没有return语句,则默认return undefined
    函数如果没有return语句,则默认returnundefined考点:undefined隐式转换成Number类型值是啥1)Number(undefined)结果是NaN,所以NaN+1=NaN2)Number(null)结果是03)Number('a')结果是NaNNumber('')结果是0Number(true)结果是1Number(false)结果是0Number([])结果是0......
  • python winrm 远程操作Windows服务器
    winrm:Windows远程管理先确定被控机器开启winrm服务打开powershell命令行winrmenumeratewinrm快速配置winrmwinrmquickconfig需要加域配置winrmwinrmsetwinrm/config/service/auth@{Basic="true"}winrmsetwinrm/config/service@{AllowUnencrypted="true"}pyt......
  • 立即执行函数的this指向是window(非严格模式下)
    请问以下JS代码最后输出的len值是多少?varlen=117;letfunc={len:935,showLen:function(){console.log(this.len);},show:function(){(function(cb){cb();})(this.showLen)}}func.show();正确答案117立即执行函数的this指......
  • 使用Sysprep封装Windows
    前言:首先感谢前同事的经验教程分享,结合自己实际情况,再进行以下的归纳总结。封装过程不介入第三方工具,不做任何优化。序号任务1安装系统,软件2封装系统3捕获ISO,生成win文件4注入ISO5利用Ventoy制作U盘启动盘              ......
  • windows 环境下dev c++安装第三方库
    参考资料https://blog.csdn.net/u011342183/article/details/79823564测试下载第三方库开发文件安装到devc++设置路径选择工具->编译器选项然后导入include路径......
  • Linux与windows互传文件命令rz&sz
    rz和sz命令使用rz命令是方便从windows传文件到Linux,在windows下通过连接工具进入linux系统,cd到自己需要的目录,命令行输入rz,然后回车,之后会弹出一个选择框,选择我们需要上传的文件,然后add,最后上传就好了。rz当文件存在需要覆盖原文件时用rz-y命令rz-ysz命令反过来,是从Li......
  • javascript 手动实现 bind,call,apply
     js手动实现call方法Function.prototype.myCall=function(content,...args){letmyfn=Symbol()content=content||globalThis//console.log(content)content[myfn]=this//console.log(content)constresu......
  • JavaScript--变量和数据类型
    使用var声明变量vartest=20;test="张三";变量可以存放不同类型的值var定义域分布在全局并且可以重复定义letlet关键字所在的代码块内有效JavaScript中分为:原始类型和引用类型5种原始类型number:数字,整数或者小数string:字符、字符串boolean:布尔null:空undefined:......
  • 【JavaScript】事件轮询
    1、先参考搞懂JavsScript异步— 事件轮询2、明确几点:setTimeout、DOMEvent、HttpRequest、setInterval、setImmediate(Node.js独有)的回调、I/O操作、UI渲染均会被加载到消息队列(macrotask宏任务)。Promise的回调、MutationObserver、process.nextTick(Node.js独有)会被加......