标签:== 声明 允许 调用函数 注意 添加 代码块 实例 OLE
## 函数定义方式
- function XX(){
}
- 函数表达式(匿名函数)
var fn = function(){}
- new function()
var func = new Function(‘a‘, ‘b‘, ‘console.log(a + b)‘);
func(3, 6);
func.__proto__ === Function.prototype
con: 所有函数都是Function的实例,函数也是对象。
Function ---> Function.prototype
## 函数的调用方式和this
普通函数调用 window对象
1.对象调用 obj
obj.func()
2.构造函数调用 --- 实例对象
new Func()
3.事件触发调用 绑定事件对象
btn.onclick = func;
4.定时器函数调用 window对象
setInterval(function(){
console.log(1);
});
同理,setTimeout(function(){
console.log(1);
});
5.匿名函数调用————函数定义后立即执行 window对象
(function(){
console.log(124);
})();
## 更改函数中 this 指向问题
call() this指向之后的参数是逗号隔开,调用函数执行
apply() this指向之后的参数是数组,调用函数执行
bind() 不会调用函数执行
## 严格模式
在严格条件下执行JS代码,
1:禁止变量没有声明就赋值,变量必须先定义后赋值
2:禁止删除已经声明的变量
3:全局作用域中函数的this是 undefined
4: 构造函数,正常模式支持:Student(‘macro‘),不加new 调用,支持 this.name = name;
但严格模式 this undefined
5: 严格模式下 参数名不能重复
6:不允许在非函数代码块中定义代码
if(true){
function fun(){
console.log(123);
}
}
但是这种是允许的:
function fun(){
function func1(){
console.log(456);
}
}
## 高阶函数
函数的参数是函数,或者返回值是函数
function fn(){
return function(){
console.log(123);
}
}
深拷贝:
<script>
var obj = {
a: 10,
b: 20,
info: {
c: 30
}
};
function deepCopy(target, source) {
for (var key in source) {
// console.log(key, source[key]);
var item = source[key];
if (item instanceof Array) {
target[key] = [];
deepCopy(target[key], item);
} else if (item instanceof Object) {
target[key] = {};
deepCopy(target[key], item);
} else {
target[key] = item;
}
}
}
var target = {};
deepCopy(target, obj);
console.log(target);
</script>
原理还不够清晰
bind()应用
<script>
var btn = document.querySelector(‘#btn‘);
var num = 10;
btn.onclick = function() {
this.innerHTML = "剩余 " + num + " S";
setInterval(function() {
this.innerHTML = "剩余 " + --num + " S";
}.bind(this), 1000);
}
</script>
apply bind call --注意用法
function fn(a, b) {
console.log(this);
console.log(a, b);
}
var obj = {
a: 10
}
fn.apply(obj, [1, 2]);
fn.call(obj, 3, 4);
//必须有指向对象this ,
var max = Math.max.apply(null, [2, 3, 6, 8, 5]);
console.log(max);
var arr = [45, 23, 54, 67, 88];
var max = Math.max.apply(null, arr);
console.log(max);
//call apply bind区别
//返回由指定this值和初始化参数改造的原函数拷贝
var newFunc = fn.bind(obj, 3, 4);
newFunc();
## 闭包
- 全局作用域 局部作用域
- 正常模式下,局部作用域变量在全局内不可见 undefined
- 闭包:全局内有权利访问另一个函数作用域中的变量的函数。
-闭包 可以延伸变量作用范围
[动态添加属性来记录]
[闭包]
## 函数同步异步问题
标签:== 声明 允许 调用函数 注意 添加 代码块 实例 OLE
原文地址:https://www.cnblogs.com/macro-renzhansheng/p/13045095.html