- Object.defineProperty();里面有三个属性,这个方法用于定义对象中新属性或修改原有属性,第一个参数是想要修改的对象的对象名,第二个参数是对象的新的属性名或者原有的属性名,第三个参数是一个对象,书写属性的参数,第三个对象里面的值如下
图中的第二个属性其实就是属性值可不可以被修改的意思
函数进阶
可以利用new Function(‘参数1’, ‘参数2’, ‘函数体’)来定义函数
参数可以是多个
var f = new Function('a', 'b', 'console.log(a + b)');
f(1, 2);
里面内容必须要以字符串格式书写
所有函数都是Function的实例,函数也属于对象
函数里面的this指向
其实还是谁调用就指向谁
btn.onclick = function () {
this.disabled = true;
setTimeout(function () {
//this指向window
this.disabled = false;
}.bind(this) ,3000)//bind里面的this指向btn
}
严格模式
在es5之后出现了严格模式,ie10及以上有严格模式
- 保留字不可以作为变量名
- 变量必须声明
- 不能随意删除已经定义好的变量
- 全局作用域中函数指向undefined
- 如果构造函数不加new调用,this会报错
- 定时器里面的this指向的还是window
- 函数里面不能有一样的参数
- 不允许在非函数的代码块里面书写函数
-
为脚本开启严格模式
‘use strict’;
在所有代码前面书写 -
为某个函数开启严格模式
在想开启的函数内部的顶端写上’use strict’;
高阶函数
函数里面接受的参数或者返回值是另一个函数,那么最开始的函数叫做高阶函数
callback&&callback();回调函数的执行
闭包
闭包是指有权访问另一个函数作用域中的变量的函数(其实也是函数)
简单理解就是一个作用域可以访问另一个函数内部的局部变量
function fun() {
var num = 10;
function fu() {
console.log(num);
}
fu();
}
fun();
图中的closure就表示闭包
主要作用:延伸了变量的作用
用闭包获取当前li的索引号
var lis = document.querySelectorAll('li');
for(var i = 0; i < lis.length; i ++){
(function (x) {
lis[x].onclick = function () {
console.log(x);
}
}(i));
}
var name = 'The Window';
var obj = {
name : 'My Object',
getName () {
let that = this;
return function () {
console.log(that.name);
}
}
}
obj.getName()();//My Object
这个里面涉及了闭包,哪怕that的作用域不在全局,但这样返回造成闭包导致仍然可以访问的到that
递归
一个函数在内部自己调用自己
拷贝
浅拷贝
浅拷贝es6中有一个语法糖,就是Object.assign(target, origin);