<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA_Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
<link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
<script>
// 严格模式对Javascript的语法和行为,都做了一些改变。
// 1.变量规定
// 1 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var命令声明,然后再使用。
'use strict';
// 我们的变量名必须先声明在使用
// num = 10;
// console.log(num);//报错:Uncaught ReferenceError: num is not defined
// 2 严禁删除已经声明变量。例如,delete x;语法是错误的。
// var x = 100;
// console.log(x);
// delete x;// 报错 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
// 2.严格模式下this指向问题
//以前在全局作用域函数中的this指向window对象。
// 严格模式下全局作用域函数中的this是undefined。(如下)
// function fn() {
// console.log(this);
// }
// fn();// 输出 undefined
// 严格模式下,如果 构造函数不加new调用,this 会报错。(因为this指向undefined,不能给 this 进行赋值操作)
// function Star() {
// this.sex = '男';
// }
// Star();// 报错 Uncaught TypeError: Cannot set property 'sex' of undefined
// new 实例化的构造函数指向创建的对象实例。
// function Star_1() {
// this.sex = '男';
// }
// var ldh = new Star_1();
// console.log(ldh.sex);// 男
// 定时器 this 还是指向 window
setTimeout(function () {
console.log(this);
},1000);// Window {parent: Window, opener: null, top: Window, length: 0, frames: Window, …}
// 事件和对象 还是指向调用者
// 函数里面不能用重名的参数
//function fn_1(a,a) {
//console.log(a+a);
//};
//fn_1(1,2);
// 在非严格模式下 输出 4 (先把 1 赋值给a 接着将2 赋值给a,所以 a+a = 4)
// 在严格模式下 输出: Uncaught SyntaxError: Duplicate parameter name not allowed in this context
// 函数必须声明在顶层.新版本的JavaScript 会引入“块级作用域”(ES6中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。
if (true){
function f() {
} // 语法错误
}
f();
for (var i = 0;i < 5;i++){
function f1() {
} // 语法错误
}
f1();
function f2() {
function f3() {
}// 合法
}// 合法
</script>
</head>
<body>
</body>
</html>
javascript 严格模式
最新推荐文章于 2022-08-23 20:05:23 发布