1.函数声明
函数体执行到return结束 没写return 执行到}结束 return 后面不写代码
格式:
function fn(形式参数){
形式参数接受实际参数
}
函数调用 函数名()
fn(实际参数)
function add(a,b){
console.log(a+b);
// 函数内部不写返回值 返回undefined
return a + b
// 一般情况下 写在return后面代码不生效 变量提升
// var c = 10;
// console.log(a + b );
}
var result = add(1,2);
console.log(result);
函数表达式 匿名函数赋值给一个变量
var sum = function(a,b){
console.log(a+b);
}
sum(1,2,3,4,5)
2.函数提升
函数会提升到当前作用域得最顶部 var声明变量会提升到当前作用域顶部
foo();
function foo(){
console.log('我是一个函数');
}
var foo = 'hello function';
console.log(foo);
3.auguments
auguments 属性 专门用来保存实际参数列表得类数组对象
arguments内部属性 callee 仅当当前相关函数正在执行才可用
function fn(a,b){
console.log(a,b);
console.log(arguments.length);
console.log(arguments[3]);
console.log(arguments.callee,'arguments得属性')
console.log(arguments.callee === fn)
4.this
this 是函数赖以执行得环境对象
(1)关注this被谁拥有 (2)关注拥有this方法被谁调用 this就指向谁
1.单独使用this this在nodejs指向当前模块 this在浏览器指向全局对象window
2.函数内部使用this this指向全局对象 global window
3.方法中使用this this指向拥有该方法得调用者
4.在事件中使用this this指向接收事件得元素
5.显示函数绑定时,可以更改this指向
name = 'larry';
var obj = {
name:'terry',
sayName:function(){
console.log(this);
console.log(this===obj);
console.log(this===globalThis);
console.log(this.name);
}
}
obj.sayName();//this -->obj对象 this===obj true this.name--->terry
var x = obj.sayName;
x();//this --global this===obj false this===globalThis true
var obj1 = {
name:'terry'
}
var obj2 = {
sayName:function(){
console.log(this.name,this)
}
}
// call 方法修改this指向 参数:this执行得环境对象
obj2.sayName.call(obj1);
5.IIFE
立即执行函数 声明得时候就调用
特点:1.页面加载得时候会立即执行一次
2.拥有局部作用域 变量不会泄露
格式:立即执行函数 (匿名函数(形式参数){})(实际参数)
var i = 0;
for(;i<6;i++){
function foo(){
console.log(i)
}
}
foo();//6
for(var i = 0;i<6;i++){
(function(j){
console.log(j)
})(i);//0 1 2 3 4 5
}
var arr = [];
// 循环遍历 往数组添加元素
for(var i=0;i<5;i++){
// 闭包 函数内部使用函数外部变量 解决作用域问题
arr[i] = (function(j){
return function(){
console.log(j)
}
})(i);// 0 1 2 3 4
}
arr[4]();
6.作用域
块级作用域 if(){} for(){}
例如:
if(true){
let a = 10;
};
console.log(a)
函数内作用域 (局部作用域) 函数内部得变量函数外部是无法获取 不适用var声明得变量也是全局变量 a = 10;函数外得作用域 (全局作用域) 函数内部可以获取函数外部得变量
var v1 = 10;
v2 = 20;
function foo(){
var a = 30;
b = 30;
console.log(v1,v2);
}
foo();
console.log(a,b)
7.作用域链
作用域链:自由变量沿着作用域追层向上寻找的过程构成了作用域链
自由变量:当前作用域中本身没有这个变量,但是想要获取到该变量对应的值
var a = 10;
function foo(){
var b = 20;
function fn(){
var c = 30;
console.log(a);
console.log(b);
console.log(c);
console.log(d);
}
fn()
}
foo();
var a = 10;
function fn() {
var b = 20;
function bar() {
console.log(a + b)
}
return bar
}
var x = fn();
b = 200;
x();
8.函数调用(修改this指向)
1.如何修改函数this指向?
* 1.call(执行环境对象,实参列表)
* 2.apply(执行环境对象,[实参列表])
* 3.bind(执行环境对象,实际参数)(实际参数)
2.函数调用得方式
* 1.函数名()
* 2.call();
* 3.apply()
* 4.bind()()
var obj = {
name:'terry',
sayName:function(){
console.log(this,this.name)
}
}
var obj1 = {
name:"larry",
sayName:function(a,b){
console.log(this.name,a,b)
}
}
obj1.sayName.bind(obj)(1,2);
obj.sayName();
obj1.sayName();
1.修改this指向 call()
obj1.sayName.call(obj,1,2);
2.修改this指向 apply()
obj1.sayName.apply(obj,[1,2]);
3.修改this指向 bind()() bind()返回当前函数本身 bind()()调用函数
console.log(obj1.sayName.bind(obj,1,2));