复习ECMAScript 5.0第二天

这是我参与更文挑战的第8天,活动详情查看:更文挑战

函数绑定

ES5对函数拓展了bind方法

作用:为函数绑定作用域(当函数执行的时候,改变函数的作用域,并传递参数)

call与apply的区别

他们都是改变函数作用域的方法,都是在调用该方法的时候,执行函数并改变作用域的,第一个参数
都是改变的作用域

call 从第二个参数开始,表示传递给函数的参数

apply 第二个参数是数组,每一个成员表示传递给函数的参数

bind跟call类似

第一个参数表示改变的作用域对象

从第二个参数开始,表示传递的参数

区别:

call | apply 调用即执行

bind调用不执行,但是得到一个新的方法,可以执行

日期拓展

toJSON 将日期转化成json格式,(标准化格式)
举例:

var date = new Date();
console.log(date)
console.log(date.toJSON())
复制代码

严格模式

ES5拓展了严格模式,使我们的代码更加的安全可靠

在之前书写的代码都是出于正常模式下

正常模式下,定义一个变量可以不使用var, 严格模式下不允许的

正常模式下,可以使用八进制,严格模式下是不允许

正常摸下,可以使用arguments.callee, 严格模式下是不允许

开启严格模式

使用方式: “use strict”

加入”use strict”之后,如果认识它的浏览器就会自动开启严格模式,如果不认识它的浏览器也只是

当做一个字符串定义, 不会影响后续代码

开启严格模式之后,就必须按照严格模式的代码规范书写代码

在js代码第一行加入”use strict”, 此时代码将处于“全局严格模式”

在某个函数的第一行加入“use strict”, 当函数执行的时候,此时函数将处于“局部严格模式”

举例:
在正常模式下:

// 使用var 定义变量
var a = 10;

// 不使用val 在严格模式下是不允许
b = 20; 
复制代码

结果:

图片1.png

在严格模式下:

// 开启严格模式  在开启严格模式代码之前, 仍处于正常模式
"use strict"
// 使用var 定义变量
var a = 10;

// 不使用val 在严格模式下是不允许
b = 20; 
复制代码

报错:

图片2.png

举例:

// 局部严格模式
// 定义函数
function localStrict() {
	// 开启严格模式
	"use strict"
	// 定义变量
	var a = 10;
	// b = 11;
}

localStrict();


// 不使用var 定义变量
c = 20;
复制代码

在严格模式下定义变量

在严格莫下定义变量必须使用val声明

允许:

var a = 10
复制代码

不允许:

b = 20
复制代码

举例:

// 开启严格模式
"use strict"
// 使用var 定义变量
var a = 10;

// 不使用var 定义变量 
// 在严格模式下不允许 不使用var定义变量
b = 20;
复制代码

八进制

在js中有三种进制, 分别是8进制,10进制, 16进制

默认是10进制

以0开头是8进制

以0x, ox开头是16进制

允许:

var num = 16var num1 = 0xff
复制代码

不允许:

var num = 011;
复制代码

举例:

在正常模式下:

// 定义变量
var num = 16;
var num1 = 0xff;

var num2 = 011;
复制代码

输出:

图片3.png

在严格模式下:

// 开启严格模式
"use strict"
var num2 = 011;
复制代码

会报错:

图片4.png

arguments.callee

代码写的越“具体”, 越能提升性能

arguments.callee在编译阶段是无法解析出来,只有当执行到的时候才能确定下来,所以就无从提升性能

在正常模式下:

// 安全类
function People(name, age, sex) {
	// 判断this指向
	if (this instanceof arguments.callee) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	} else {
		// 没有使用new 调用
		return new arguments.callee(name, age, sex);
	}
}

// 实例化对象
var p = new People("小明", 12, "男");
var p1 = People("小龙", 12, "男");
复制代码

输出:

图片5.png

在严格模式下:

// 开启严格模式
"use strict"
// 安全类
function People(name, age, sex) {
	// 判断this指向
	if (this instanceof arguments.callee) {
		this.name = name;
		this.age = age;
		this.sex = sex;
	} else {
		// 没有使用new 调用
		return new arguments.callee(name, age, sex);
	}
}

// 实例化对象
var p = new People("小明", 12, "男");
var p1 = People("小龙", 12, "男");
复制代码

会报错:

图片6.png

delete

使用delete可以删除对象中属性

如果要删除一个变量

在正常模式下,可以执行成功, 不会删除成功,但是不会报错,而严格模式下会报错

正常模式下:

// 定义全局变量
var a = 10;
window.b = 20;

// 删除变量
6console.log(delete a);
console.log(delete b);
复制代码

输出:

图片7.png

严格模式下:

// 开启严格模式
"use strict"
// 定义全局变量
var a = 10;
window.b = 20;

// 删除变量
console.log(delete a);
console.log(delete b);
复制代码

会报错:

图片8.png

使用保留字定义变量

正常模式下可以使用保留字定义变量

严格模式是不允许使用

在正常模式下:

// 使用保留字
var public = "hehe";
复制代码

输出:

图片9.png

在严格模式下:

// 开启严格模式
"use strict"
// 使用保留字
var public = "hehe";
复制代码

会报错:

图片10.png

eval

eval是一个函数,可以将字符串当做代码执行,但是会污染全局作用域

在严格模式下是不允许使用的, 所以可以避免污染全局作用域

举例:

在正常模式下:

// 定义变量
var strcode = "var a = 10";

// eval接受一个参数就是字符串, 执行结果就是字符串代码
// 当eval执行的时候, a真的被定义出来了
eval(strcode);
复制代码

输出:

图片11.png

在严格模式下:

// 开启严格模式
"use strict"
// 定义变量
var strcode = "var a = 10";

// eval接受一个参数就是字符串, 执行结果就是字符串代码
// 当eval执行的时候, a真的被定义出来了
eval(strcode);
复制代码

结果:

图片13.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享