首页
学习
活动
专区
工具
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。...函数声明 严格模式只允许全局作用域或函数作用域顶层声明函数。也就是说,不允许函数代码块内声明函数

82830
  • 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) ...

    30910

    面试官问:能否模拟实现JScall和apply方法

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

    81730

    JS中this指向问题

    全局上下文 严格模式严格模式中this都是指向顶层对象(浏览器中window)。...第一个参数undefined或者null严格模式指向window。严格模式,就是指向第一个参数。后文详细解释。 经常有这类代码(回调函数),其实也是普通函数调用模式。...需要注意,指定this值并不一定是该函数执行时真正this值,如果这个函数处于严格模式,则指定为nullundefinedthis值会自动指向全局对象(浏览器中就是window对象),同时值为原始值...严格模式nullundefined,指向全局对象(浏览器中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 值,如果这个函数处于严格模式,则指定为 nullundefined 时会自动指向全局对象(浏览器中就是window对象

    1.2K20

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

    isStrict) { // 如果在严格模式,thisArgnullundefined,需要将thisArg置为全局对象 if (thisArg === null || thisArg...= this; // 此时如果thisArg对象仍然nullundefined,那么说明严格模式,并且没有指定第一个参数或者第一个参数值本身就是nullundefined,此时将目标函数当成普通函数执行并返回其结果即可...// 如果在严格模式,thisArgnullundefined,需要将thisArg置为全局对象 if (thisArg === null || thisArg === undefined)...作为普通函数调用严格模式,thisnull严格模式,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,这些值会在调用时被忽略,实际应用默认绑定规则。

    42810

    面试官问:JSthis指向

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

    76320

    this到底是什么?

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

    57330

    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绑定到全局对象

    50110

    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也不一样 可以使用多种方式修改

    60730

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

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

    7610

    一篇文章带你了解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进制前两位必须

    54410

    恭喜你获得治疗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

    27160

    严格模式 – JavaScript

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

    1K30

    迷失中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
    领券