JavaScript的函数严格模式

简介: 首先,严格模式要求命名函数参数必须唯一。看下面的例子:

2000元阿里云代金券免费领取,2核4G云服务器仅664元/3年,新老用户都有优惠,立即抢购>>>


阿里云采购季(云主机223元/3年)活动入口:请点击进入>>>,


阿里云学生服务器(9.5元/月)购买入口:请点击进入>>>,

一、函数

首先,严格模式要求命名函数参数必须唯一。看下面的例子:

// 命名参数重名
// 非严格模式:没有错误,只有第二个参数有效
// 严格模式:抛出 SyntaxError 
function sum (num, num){
    
 // 函数代码
}

在非严格模式下,这个函数声明不会抛出错误。这样可以通过名称访问第二个 num,但只能通过
arguments 访问第一个参数arguments 对象在严格模式下也有一些变化。在非严格模式下,修改命名参数也会修改 arguments
对象中的值。而在严格模式下,命名参数和 arguments 是相互独立的。例如:

// 修改命名参数的值
// 非严格模式:arguments 会反映变化
// 严格模式:arguments 不会反映变化
function showValue(value){
    
 value = "Foo"; 
 alert(value); // "Foo" 
 alert(arguments[0]); // 非严格模式:"Foo" 
 // 严格模式:"Hi" 
} 
showValue("Hi");

在这个例子中,函数 showValue()有一个命名参数 value。调用这个函数时给它传入参数"Hi",
该值会赋给value。在函数内部,value被修改为"Foo"。在非严格模式下,这样也会修改arguments[0]
的值,但在严格模式下则不会。
另一个变化是去掉了 arguments.callee 和 arguments.caller。在非严格模式下,它们分别引
用函数本身和调用函数。在严格模式下,访问这两个属性中的任何一个都会抛出 TypeError。例如:

// 访问 arguments.callee 
// 非严格模式:没问题
// 严格模式:抛出 TypeError 
function factorial(num){
    
 if (num <= 1) {
    
 return 1; 
 } else {
    
 return num * arguments.callee(num-1) 
 } 
} 
let result = factorial(5);

类似地,读或写函数的 caller 或 callee 属性也会抛出 TypeError。因此对这个例子而言,访问
factorial.caller 和 factorial.callee 也会抛出错误。
另外,与变量一样,严格模式也限制了函数的命名,不允许函数名为 implements、interface、
let、package、private、protected、public、static 和 yield。
关于函数的最后一个变化是不允许函数声明,除非它们位于脚本或函数的顶级。这意味着在 if 语句中声明的函数现在是个语法错误// 在 if 语句中声明函数

// 非严格模式:函数提升至 if 语句外部
// 严格模式:抛出 SyntaxError 
if (true){
    
 function doSomething(){
    
 // ... 
 } 
}

所有浏览器在非严格模式下都支持这个语法,但在严格模式下则会抛出语法错误

目录
相关文章
|
3天前
|
JavaScript 前端开发
JavaScript 闭包:让你更深入了解函数和作用域
JavaScript 闭包:让你更深入了解函数和作用域
|
3天前
|
JavaScript 前端开发 网络架构
函数柯里化:JavaScript中的高级技巧
函数柯里化:JavaScript中的高级技巧
|
3天前
|
JavaScript 前端开发
JavaScript的`apply`方法:函数的“应用”与“调用”
JavaScript的`apply`方法:函数的“应用”与“调用”
|
3天前
|
JavaScript 前端开发
JavaScript的`bind`方法:函数的“复制”与“定制”
JavaScript的`bind`方法:函数的“复制”与“定制”
|
3天前
|
JavaScript 前端开发
JavaScript的`call`方法:实现函数间的调用!
JavaScript的`call`方法:实现函数间的调用!
|
5天前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
18 2
|
5天前
|
前端开发 JavaScript 数据处理
在JavaScript中,异步函数是指什么
【5月更文挑战第9天】JavaScript中的异步函数用于处理非立即完成的操作,如定时器、网络请求等。它们可通过回调函数、Promise或async/await来实现。示例展示了如何使用async/await模拟网络请求:定义异步函数fetchData返回Promise,在另一异步函数processData中使用await等待结果并处理。当fetchData的Promise解析时,data变量接收结果并继续执行后续代码。注意,调用异步函数不会阻塞执行,而是会在适当时间点继续。
12 0
|
5天前
|
自然语言处理 JavaScript 前端开发
在JavaScript中,this关键字的行为可能会因函数的调用方式而异
【5月更文挑战第9天】JavaScript中的`this`关键字行为取决于函数调用方式。在非严格模式下,直接调用函数时`this`指全局对象,严格模式下为`undefined`。作为对象方法调用时,`this`指向该对象。用`new`调用构造函数时,`this`指向新实例。通过`call`、`apply`、`bind`可手动设置`this`值。在回调和事件处理中,`this`可能不直观,箭头函数和绑定方法可帮助管理`this`的行为。
15 1
|
5天前
|
JavaScript 前端开发 网络架构
JavaScript中的箭头函数是一种新的函数表达形式
【5月更文挑战第9天】JavaScript的箭头函数以简洁语法简化函数定义,其特性包括:1) 不绑定自身this,继承上下文的this,适合回调和事件处理;2) 没有arguments对象,需用剩余参数语法访问参数;3) 不能用作构造函数,无new调用;4) 没有prototype属性,不支持基于原型的继承。箭头函数在特定场景下优化了this处理,但使用时要注意与普通函数的差异。
12 2
|
5天前
|
JavaScript 前端开发 安全
javascript中的严格模式(use strict)
javascript中的严格模式(use strict)
17 1
http://www.vxiaotou.com