首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

确定函数是使用null、undefined还是全局对象在非严格模式下调用的

在JavaScript中,函数的调用方式会影响this关键字的值。在非严格模式(non-strict mode)下,如果函数不是作为某个对象的方法调用,而是直接调用(即独立函数调用),那么this的值会指向全局对象。在浏览器环境中,全局对象就是window;在Node.js环境中,全局对象是global

基础概念

  • 全局对象:在浏览器中是window,在Node.js中是global。它包含了所有全局变量和函数。
  • nullundefinednull是一个表示“无”的对象,转换为数值时为0;undefined表示变量未定义,转换为数值时为NaN。
  • 非严格模式:JavaScript的默认模式,不使用'use strict';指令。

相关优势

  • 使用全局对象可以访问所有全局变量和函数。
  • nullundefined可以作为函数的参数或返回值,表示特定的意义。

类型

  • 全局调用this指向全局对象。
  • 作为对象方法调用this指向调用该方法的对象。
  • 构造函数调用this指向新创建的实例。
  • 使用.call().apply().bind()调用this可以被显式设置。

应用场景

  • 当你需要访问全局变量或函数时,可以使用全局对象。
  • 当你想要表示某个值不存在时,可以使用nullundefined

遇到的问题及解决方法

如果你在非严格模式下直接调用一个函数,并且希望this不是全局对象,你可以:

  1. 使用.call().apply()方法显式设置this的值。
  2. 将函数定义为某个对象的方法,然后通过该对象调用函数。

示例代码

代码语言:txt
复制
// 非严格模式下直接调用函数
function test() {
  console.log(this === window); // 在浏览器中输出 true
}

test();

// 使用.call()方法
function test2() {
  console.log(this === myObject); // 输出 true
}

var myObject = {};
test2.call(myObject);

// 定义为对象的方法
var myObject2 = {
  method: function() {
    console.log(this === myObject2); // 输出 true
  }
};

myObject2.method();

参考链接

在处理这类问题时,理解JavaScript的执行上下文和this关键字的绑定规则是非常重要的。如果你遇到具体的问题,可以根据上述信息进行调试和解决。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Js严格模式

不允许直接声明全局变量 // 非严格模式 x = 1; console.log(window.x); // 1 // 严格模式 "use strict"; var x = 1; // 可以使用var在全局作用域声明全局变量...对一个普通的函数来说,this总会是一个对象:不管调用时this它本来就是一个对象;还是用布尔值,字符串或者数字调用函数时函数里面被封装成对象的this;还是使用undefined或者null调用函数式...this代表的全局对象(使用call,apply或者bind方法来指定一个确定的this)。...所以对于一个开启严格模式的函数,指定的this不再被封装为对象,而且如果没有指定this的话它值是undefined。...在普通模式下用这些扩展的话,当一个叫fun的函数正在被调用的时候,fun.caller是最后一个调用fun的函数,而且fun.arguments包含调用fun时用的形参。

2.3K30

JavaScript 严格模式

在严格模式下,ECMAScript 3中的一些不确定的行为将得到处理,而且对于某些不安全的操作也会抛出错误。...同样的代码有些时候严格模式会比非严格模式下更快。 严格模式禁用了一些有可能在未来版本中定义的语法。 开启严格模式 使用 ‘use strict’; 进入严格模式。...,this总会是一个对象:不管调用时this它本来就是一个对象;还是用布尔值,字符串或者数字调用函数时函数里面被封装成对象的this;还是使用undefined或者null调用函数时this代表的全局对象...所以对于一个开启严格模式的函数,指定的this不再被封装为对象,而且如果没有指定this的话它值是undefined。...函数声明 严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

82930
  • JavaScript 中 的this

    首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,大概可以分为以下这几种情况。...总结:this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的 严格模式 在严格模式中,this的指向稍有不同 'use strict'; var name = 'window'; var...第二次调用 hi() 的时候,正常模式会输出 window,而严格模式则会报错,因为在严格模式中,禁止this指向全局对象,所以此时的 this 为 undefined。...//Leo 如果返回值是一个对象(非null对象),那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例。...(非null对象),那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是函数的实例。

    1.4K40

    大话 JavaScript(Speaking JavaScript):第六章到第十章

    函数必须在作用域的顶层声明 在严格模式下,所有函数必须在作用域的顶层声明(全局作用域或直接在函数内部)。这意味着您不能将函数声明放在块内。如果这样做,您将收到一个描述性的SyntaxError。...非方法函数中的this是未定义的 在松散模式下,非方法函数中this的值是全局对象(在浏览器中是window;请参阅全局对象): function sloppyFunc() { console.log...,不能删除未经限定的标识符 在松散模式下,你可以像这样删除全局变量foo: delete foo 在严格模式下,当你尝试删除未经限定的标识符时,你会得到一个语法错误。...在严格模式下被禁止的特性 在严格模式下,还有两个 JavaScript 特性是被禁止的: 不再允许使用with语句(参见The with Statement)。在编译时(加载代码时)会得到语法错误。...== undefined && x !== null) ... 用例:处理字符串中的数字 如果你不确定一个值x是一个数字还是一个数字字符串,你可以使用以下检查: if (x == 123) ...

    31110

    面试官问:能否模拟实现JS的call和apply方法

    需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值...请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。 argsArray 可选的。...而且,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。 2、都可以只传递一个参数。...}; 行文至此,就基本结束了,你可能还发现就是写的非严格模式下,thisArg原始值会包装成对象,添加函数并执行,再删除。...而严格模式下还是原始值这个没有实现,而且万一这个对象是冻结对象呢,Object.freeze({}),是无法在这个对象上添加属性的。所以这个方法只能算是非严格模式下的简版实现。最后来总结一下。

    82530

    JS中的this指向问题

    全局上下文 非严格模式和严格模式中this都是指向顶层对象(浏览器中是window)。...第一个参数是undefined或者null,非严格模式下,是指向window。严格模式下,就是指向第一个参数。后文详细解释。 经常有这类代码(回调函数),其实也是普通函数调用模式。...需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值...非严格模式下,null和undefined,指向全局对象(浏览器中是window),其余值指向被new Object()包装的对象。 对象上的函数调用:绑定到那个对象。...普通函数调用: 在严格模式下绑定到 undefined,否则绑定到全局对象。

    1.3K30

    This指向与改变This指向

    ,我们看最后调用 a 的地方 a();,前面没有调用的对象那么就是全局对象 window,这就相当于是 window.a(); 注意,这里我们没有使用严格模式,如果使用严格模式的话,全局对象就是 undefined...还是这句话:this 永远指向最后调用它的那个对象,因为最后调用 fn 的对象是 a,所以就算 a 中没有 name 这个属性,也不会继续向上一个对象寻找 this.name,而是直接输出 undefined...所以 this 指向的也就是 window。 this 的指向并不是在创建的时候就可以确定的,在 es5 中,永远是this 永远指向最后调用它的那个对象。...,箭头函数需要记着这句话:“箭头函数中没有 this绑定,必须通过查找作用域链来决定其值,如果箭头函数被非箭头函数包含,则 this 绑定的是最近一层非箭头函数的 this,否则,this 为 undefined...需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动指向全局对象(浏览器中就是window对象

    1.2K20

    彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!

    isStrict) { // 如果在非严格模式下,thisArg的值是null或undefined,需要将thisArg置为全局对象 if (thisArg === null || thisArg...= this; // 此时如果thisArg对象仍然是null或undefined,那么说明是在严格模式下,并且没有指定第一个参数或者第一个参数的值本身就是null或undefined,此时将目标函数当成普通函数执行并返回其结果即可...// 如果在非严格模式下,thisArg的值是null或undefined,需要将thisArg置为全局对象 if (thisArg === null || thisArg === undefined)...作为普通函数调用:严格模式下,this的值是null,非严格模式下,this指向全局对象。 作为方法调用:this指向所属对象。 作为构造函数调用:this指向实例化的对象。...是undefined,非严格模式下this指向全局对象。

    1.6K40

    你不知道的js中关于this绑定机制的解析

    this的四种绑定规则: 默认绑定: 规则:在非严格模式下,默认绑定的this指向全局对象,严格模式下this指向undefined function foo() { console.log(this.a...; // 严格模式下调用其他函数,不影响默认绑定 } foo2(); // 2 所以:对于默认绑定来说,决定this绑定对象的是函数体是否处于严格模式,严格指向undefined,非严格指向全局对象。...通常不会在代码中混用严格模式和非严格模式,所以这种情况很罕见,知道一下就可以了,避免某些变态的面试题挖坑。...显式绑定: 就像我们上面看到的,如果单纯使用隐式绑定肯定没有办法得到期望的绑定,幸好我们还可以在某个对象上强制调用函数,从而将this绑定在这个函数上。...如果你把null或者undefined作为this的绑定对象传入call/apply/bind,这些值会在调用时被忽略,实际应用的是默认绑定规则。

    43310

    this到底是什么?

    this是JavaScript中的一个重要的概念,它的值并不是由声明的位置来决定的,而是由调用的位置来决定。正是因为这个原因在不同的语境下它的值是不一样的,所以它成了面试官最喜欢考察的内容。...通常this由下面这四条法则就可以确定: 1. new绑定,指向创建的对象。...默认绑定:严格模式下绑定undefined,非严格模式下绑定全局变量(浏览器环境下是window)。...显示绑定(call、apply、bind)如果绑定的是null或者undefined,在严格模式下会绑定对应的值,在非严格模式下绑定全局变量(浏览器环境下是window)。...);//小秋 sayName.call();//小秋 由于绑定null或者undefined在非严格模式下会绑定全局变量window这样会很危险。

    58030

    面试官问:JS的this指向

    为了搞清楚this的指向是什么,必须知道相关函数是如何调用的。 全局上下文 非严格模式和严格模式中this都是指向顶层对象(浏览器中是window)。...第一个参数是undefined或者null,非严格模式下,是指向window。严格模式下,就是指向第一个参数。后文详细解释。 经常有这类代码(回调函数),其实也是普通函数调用模式。...需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值...非严格模式下,null和undefined,指向全局对象(浏览器中是window),其余值指向被new Object()包装的对象。 对象上的函数调用:绑定到那个对象。...普通函数调用:在严格模式下绑定到 undefined,否则绑定到全局对象。

    76720

    JavaScript严格模式

    它不是一条语句,但是是一个字面量表达式,在 JavaScript 旧版本中会被忽略。"use strict" 的目的是指定代码在严格条件下执行。严格模式下你不能使用未声明的变量。...() { y = 3.14; // 报错 (y 未定义) } 在函数内部声明是局部作用域 (只在函数内使用严格模式)是不报错的。...严格模式对动态绑定做了一些限制。某些情况下,只允许静态绑定。也就是说,属性和方法到底归属哪个对象,在编译阶段就确定。...严格模式创设了第三种作用域:eval作用域。 正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。...为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

    1.4K50

    《你不知道的JavaScript》:this 绑定规则的例外情况与总结

    例外情况1:this忽略 当把null或者undefined作为this的绑定对象传入call、apply或bind时,这些值在调用时会被忽略,此时实际应用的是默认绑定规则。...这里有个小知识点要注意,对于默认绑定来说,决定this绑定对象的不是函数调用位置是否处于严格模式,而是函数定义位置的函数体是否处于严格模式。...如果函数体处于严格模式,则this会被绑定到undefined上,否则就会绑定到全局对象上。...唔,尽管这样起作用,但是我个人是不推荐直接修改 Function.prototype的,直接修改Function的原型,还是有隐患的,特别是在常规项目中,如非没有其他办法,一般不推荐这样修改污染原型对象...由函数调用时上下文对象作为函数内部this绑定的对象。 默认绑定,优先级最低。严格模式下this绑定到undefined,非严格模式下this绑定到全局对象。

    50510

    this 之谜揭底:从浅入深理解 JavaScript 中的 this 关键字(二)

    (要理解 this,就要先理解调用位置) • 如果使用严格模式(strict mode),那全局对象将无法使用默认绑定,因此 this 会绑定到 undefined。...• 虽然 this 的绑定规则完全取决于调用位置,但是只有 foo() 运行在非 strict mode下时,默认绑定才能绑定到全局对象; 严格模式下与 foo() 的调用位置无关。...,也就是说它会默认绑定,从而把 this 绑定到全局对象或 undefined 上,这取决于是否是严格模式。...是否在某个对象中调用(隐式绑定),this 指向绑定的上下文对象 4. 如果都不是,则是默认绑定,在严格模式下,this 指向 undefined, 非严格模式下,this 指向全局对象。...如果都不是,则是默认绑定,在严格模式下,this 指向 undefined, 非严格模式下,this 指向全局对象。 2.

    8110

    JavaScript中的this关键字

    二、this的值 在全局环境(任何函数调用的外部)中,this的值都是全局对象(浏览器中是window对象,node中是global对象) 在函数内部环境,this的值取决于函数被调用的方式 三、this...() { console.log('this',this.name) } foo() // Window.name 注意:如果使用的是严格模式的话,全局对象是undefined var name =...如果是,this绑定的是那个上下文对象; 上述全不是,则使用默认绑定。如果在严格模式下,就绑定到undefined,否则绑定到全局window对象。...,如果箭头函数被非箭头函数包含,则 this 绑定的是最近一层非箭头函数的 this,否则,this 为 undefined。...new实例化新对象 可看上述new绑定实例 总结 js中的this指的是允许的上下文环境,与后端语言不同 this不是一成一变的,会随着环境而变化 严格模式与非严格模式下的this也不一样 可以使用多种方式修改

    61130

    一篇文章带你了解JavaScript中的语法,数据类型,流程控制语句以及函数

    这段代码表示它是一个编译指示,也可以在函数中执行严格模式: function daDa(){ "use strict"; // 函数体 } 关键字和保留字 ECMAScription的全部关键字:...这个时候的msg就是全局变量,可以在函数外部的如何地方被调用。 ?...file 省略了var操作符还是不对的,不建议这样做,如果给没有声明的变量赋值,在严格模式下就会导致错误,抛出ReferenceError错误。...undefined值,一个变量还没有初始化时,默认为undefined值,没有必要去显式地设置为undefined值,但是,对于null来说,null值是一个空对象的指针,如果意在变量保存的是对象,但还没有真正的保存对象...file console.log(Boolean(undefined)); VM2052:1 false Number类型: 八进制字面值第一位必须是0,然后是0到7,八进制在严格模式下是无效的,16进制前两位必须是

    55110

    恭喜你获得治疗this“皮”的详细药方

    这句话就是“this的指向在函数声明的时候是不会被确定的,只有函数执行的时候才被确定,this最终指向的是调用它的对象”。 有人说这也太长了,记不住。 好,那缩短点。 一句话。...1.在非严格模式下,浏览器中的尽头当然就是window。 2.在严格模式下也就是开启了"use strict"的情况下,尽头就是undefined。 3.node的全局环境中尽头是global。...下文中情况主要从第一种非严格模式下来对this的指向进行解释和说明。 // 我们来看下面的两个?...// 好,我们有几种情况需要记住: // 1.如果一个函数中有this // 但是它没有被上一级的对象所调用 // 那么this就会指向window(非严格模式下) // 2.如果一个函数中有this.../ 那么this还是指向函数的实例 // null比较特殊,虽然它是对象 // 但是这里this还是指向那个函数的实例 function fn(){ this.user = "笛巴哥"; return

    27460

    迷失中的this指向,看完这篇就会了

    ,我们会发现this是一个window对象 如果我们在终端直接运行1.js呢 {} [Object: null prototype] {} 在node环境下,全局的this居然是一个{}对象 严格模式下函数内部的...hello(); 在严格模式下函数内部会是undefined,并且访问publicName会直接报错 为啥use strict严格模式下全局this无法访问 于是查找资料寻得,严格模式主要有以下特征...未提前申明的变量不能使用,会报错 不能用delete删除对象的属性 定义的变量名不能重复申明 函数内部的this不再指向全局对象 还有其他的更多的参考js-script[1] this的指向 在这之前我们很基础的了解到在非严格模式下...迷失中的this指向 在这之前我们了解到非严格模式下 普通函数内部的this指向的是window对象 构造函数内的this指向的是实例化的那个对象 普通申明的对象,如果调用的方法是箭头函数,那么内部this...通常情况this在非严格模式下,指向的是全局window对象,在严格模式下,普通函数内的this不是全局对象 迷惑的this指向问题,正常情况this指向的是被调用的那个对象,但是如果是箭头函数,那么指向的是全局对象

    49040

    严格模式 – JavaScript

    不支持严格模式的浏览器与支持严格模式的浏览器行为上也不一样, 所以不要在未经严格模式特性测试情况下使用严格模式。严格模式可以与非严格模式共存,所以脚本可以逐渐的选择性加入严格模式。...严格模式下,函数的 arguments 对象会保存函数被调用时的原始参数。...对一个普通的函数来说,this总会是一个对象:不管调用时this它本来就是一个对象;还是用布尔值,字符串或者数字调用函数时函数里面被封装成对象的this;还是使用undefined或者null调用函数式...this代表的全局对象(使用call, apply或者bind方法来指定一个确定的this)。...在普通模式下用这些扩展的话,当一个叫fun的函数正在被调用的时候,fun.caller是最后一个调用fun的函数,而且fun.arguments包含调用fun时用的形参。

    1K30
    领券