JavaScript-自测题3

严格模式的限制

  1. 不允许使用未声明的变量

  2. 不允许删除变量或对象。

  3. 不允许删除函数。

  4. 不允许变量重名。

  5. 不允许使用八进制。

  6. 不允许使用转义字符。

  7. 不允许对只读属性赋值。

  8. 不允许对一个使用getter方法读取的属性进行赋值。

  9. 不允许删除一个不允许删除的属性。

  10. 变量名不能使用 “eval” 字符串。

  11. 变量名不能使用 “arguments” 字符串。

  12. 不允许使用以下这种语句:

    1
    2
    "use strict";
    with (Math){x = cos(2)}; // 报错
  13. 由于一些安全原因,在作用域 eval() 创建的变量不能被调用

  14. 禁止this关键字指向全局对象。

  15. 禁止使用保留关键字or关键词。

立即执行函数(IIFE)

在第一部分中提到IIFE实际是为了解决作用域缺陷而诞生的,那么它的诞生给我们带来了哪些好处呢?

  • 不必为函数命名,避免了污染全局变量;

  • IIFE内部形成了单独的作用域,可以封住一些外部无法读取的私有变量。

++i和i++区别在于运算顺序和结合方向。

js中有两种自加运算,其运算符均为++,功能为将运算符自加1.
其中:
++VAR被称为前自加,其后面的变量执行自加操作,其运算为,先执行自加操作,再引用VAR值。
VAR++被称为后自加,其前面的变量执行自加操作,其运算为,先引用VAR值,再进行自加操作。

如果自加语句独立成为一个单独的语句,那么前后自加是完全相同的。
比如单独的一行
a++;和++a;是一样的。
再比如,常见的for循环:
for(i = 0; i < 100; i ++)
for(i = 0; i < 100; ++i)
这里用到的++i和i++是完全相同的,没有区别。

当运算变量本身值会在自加语句中,同时执行其它操作,二者就有区别了。
比如
var i =0;
while(i++<10);
i会先和10比较大小,然后执行自加。这样当i=10时,退出循环,再执行一次自加,退出后i值为11。
而如果写成
while(++i<10);
是先执行自加,然后再与10比较。这样在i=9时,先自加,得到i=10,然后比较就会退出循环了。这种情况下,退出后i值为10。

再举一个例子。
var a, i = 10;
a = i ++; //这里i要先赋值,再自加。语句执行后a=10, i = 11;
而如果写成:
var a, i = 10;
a = ++i; //这里i要先自加,再赋值。语句执行后a=11, i = 11;

  • 例题:
1
2
3
4
5
6
7
8
9
10
11
12
13
var num = 1;
function test() {
"use strict";
console.log(this.num++);
}
function test2() {
console.log(++this.num);
}
(function(){
"use strict";
test2();
})();
test();
  • 分析图:

kyrie irving

  • 例题:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function C1(name) {
if(name){
this.name = name;
}
};
function C2(name){
this.name = name;
};
function C3(name) {
this.name = name || 'fe';
};
C1.prototype.name = "zhang";
C2.prototype.name = "wang";
C3.prototype.name = "li";
console.log((new C1().name) + (new C2().name) + (new C3().name))
  • 分析图:

kyrie irving

  • 例题:
1
2
3
4
5
6
7
8
9
10
11
12
13
function test () {
console.log(1);
};
(function(){
if(false){
function test(){
console.log(2);
}
}
test();
})();
// 立即执行函数 函数作用域
// test is not a function