方式1 函数声明方式 function 关键字 (命名函数)
function fn(){}
方式2 函数表达式(匿名函数)
var fn = function(){}
方式3 new Function()
var f = new Function('a', 'b', 'console.log(a + b)');
f(1, 2);
var fn = new Function('参数1','参数2'..., '函数体')
注意
function fn() {
console.log('人生的巅峰');
}
fn();
var o = {
sayHi: function() {
console.log('人生的巅峰');
}
}
o.sayHi();
function Star() {};
new Star();
btn.onclick = function() {};
setInterval(function() {}, 1000); 这个函数是定时器自动1秒钟调用一次
(function() {
console.log('人生的巅峰');
})();
- 函数内部的this指向
this执行只有在调用函数的时候才确定、一般指向调用者
- 改变函数内部 this 指向的方法
call()方法、呼叫的意思、主要用于实现继承、
作用、1、调用方法、2、改变this指向
apply()方法、应用、运用的意思、
作用、1、调用方法、2、改变this指向
不同的是参数必须是数组(伪)
bind()方法、捆绑、绑定的意思、
作用、1、不会调用函数、2、改变this指向
拷贝原来的函数改变this、返回一个新的函数
用于:不想立即执行函数、又想改变这个函数内部的this执行时用bind()
例如定时器、我想触发时才调用
共同点 : 都可以改变this指向
不同点:
call 和 apply 会调用函数, 并且改变函数内部this指向.
call 和 apply传递的参数不一样,call传递参数使用逗号隔开,apply使用数组传递
bind 不会调用函数, 可以改变函数内部this指向.
应用场景
1. call 经常做继承.
2. apply经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
3. bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向.
(function (){
"use strict";
var num = 10;
function fn() {}
})();
<script>
"use strict";
</script>
– 为函数开启严格模式 :让use strict模式作用于局部作用域
要给某个函数开启严格模式,需要把“use strict”; (或 ‘use strict’; ) 声明放在函数
体所有语句之前。
function fn(){
"use strict";
return "123";
}
'use strict'
num = 10
console.log(num)
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐
var num2 = 1;
delete num2;
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐
function fn() {
console.log(this);
}
fn();
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐‐
function Star() {
this.sex = '男';
}
他赋值则 会报错.
var ldh = new Star();
console.log(ldh.sex);
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐‐‐
setTimeout(function() {
console.log(this);
}, 2000);
- 高阶函数
传递的是函数或者返回的是函数就是高阶函数
- 闭包
–变量的作用域
变量根据作用域的不同分为两种:全局变量和局部变量。
- 函数内部可以使用全局变量。
- 函数外部不可以使用局部变量。
- 当函数执行完毕,本作用域内的局部变量会销毁。
- 什么是闭包
闭包指一个函数访问另一个函数中的局部变量
<script>
function fn() {
var num = 10;
function fun() {
console.log(num);
}
fun();
}
fn();
</script>
闭包的作用
延伸了变量的作用范围、 延长了变量的生命周期、
function fn() {
var num = 10;
function fun() {
console.log(num);
}
return fun;
}
var f = fn();
f();
for (var i = 0; i < lis.length; i++) {
量
(function(i) {
lis[i].onclick = function() {
console.log(i);
}
})(i);
}
for (var i = 0; i < lis.length; i++) {
(function(i) {
setTimeout(function() {
console.log(lis[i].innerHTML);
}, 3000)
})(i);
}
var car = (function() {
var start = 13;
var total = 0;
return {
price: function(n) {
if (n <= 3) {
total = start;
} else {
total = start + (n ‐ 3) * 5
}
return total;
},
yd: function(flag) {
return flag ? total + 10 : total;
}
}
})();
console.log(car.price(5));
console.log(car.yd(true));
思考题
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
};
console.log(object.getNameFunc()())
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
‐‐‐‐‐‐‐‐‐‐
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
var that = this;
return function() {
return that.name;
};
}
};
console.log(object.getNameFunc()())
- 递归
– 什么是递归
简单理解:函数内部自己调用自己, 这个函数就是递归函数
作用:重复执行某段代码
注意:递归函数的作用和循环效果一样,由于递归很容易发生“栈溢出”错误(stack overflow),所以必须要加退出条件return。
function fn(n) {
if (n == 1) {
return 1;
}
return n * fn(n ‐ 1);
}
console.log(fn(3));