JavaScript——函数

一、函数的定义与调用(与python类同) 

// 无参函数
function f1() {
  console.log("Hello world!");
};
f1();

// 有参数函数
function f2(a, b) {
  console.log(arguments);  // 内置的arguments对象
  console.log(arguments.length);

  console.log(arguments[0],arguments[1]);
  console.log(a, b);
};
f2(10,20);

// 带返回值的函数
function sum(a, b){
  return a + b;
}
sum(1, 2);  // 调用函数

// 匿名函数
var sum = function(a, b){
  return a + b;
}
sum(1, 2);

// 立即执行函数
(function(a, b){
  return a + b;
})(1, 2);

二、函数中的arguments参数

function add(a,b){
  console.log(a+b);
  console.log(arguments.length)
}

add(1,2)   //  3  2 

注意:函数只能返回一个值,如果要返回多个值,只能将其放在数组或对象中返回

三、函数的全局变量和局部变量

#局部变量:

在JavaScript函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它(该变量的作用域是函数内部)。只要函数运行完毕,局部变量就会被删除。

#全局变量:
在函数外声明的变量是全局变量,网页上的所有脚本和函数都能访问它。

#变量生存周期:
JavaScript变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。

四、作用域

首先在函数内部查找变量,找不到则到外层函数查找,逐步找到最外层。另外函数的作用域关系是在定义阶段就固定死的,与调用位置无关

//举例,用法 跟python查找变量的顺序一致
var city = "BeiJing";
function f() {
  var city = "ShangHai";
  function inner(){
    var city = "ShenZhen";
    console.log(city);
  }
  inner();
}

f();  //ShenZhen

var city = "BeiJing";
function Bar() {
  console.log(city);
}
function f() {
  var city = "ShangHai";
  return Bar;
}
var ret = f();
ret();  // BeiJing

var city = "BeiJing";
function f(){
    var city = "ShangHai";
    function inner(){
        console.log(city);
    }
    return inner;
}
var ret = f();
ret();  //ShangHai

五、javascript中的变量提升和函数提升

1、在js中只有两种作用域

  全局作用域、函数作用域

  ps:在ES6之前,js是没有块级作用域。

2、什么是没有块级作用域?

3、什么是变量提升?

在js中,代码执行时分两步走:1、解析 2、一步一步执行

那么变量提升就是变量声明会被提升到作用域的最顶上去,也就是该变量不管是在作用域的哪个地方声明的,都会提升到作作用域的最顶上去。

举例分辨:

4、什么是函数提升?

举例1:

fn();  //此处可以正常调用
console.log(fn);
function fn(){
    console.log("哈哈哈哈")
}
fn(); //此处也可以正常调用

//输出结果:

哈哈哈哈
{
    console.log("哈哈哈哈")
}
哈哈哈哈

//注意:函数声明式,会将函数的声明和定义一起提升到作用域的最顶上去。

举例2:

函数表达式声明的函数

console.log(fn); //undefined
var fn=function (){
    console.log("举例2")
};
console.log(fn);

//输出结果:
ƒ (){
    console.log("举例2")
}

举例3:

如果函数声明和变量声明使用的是同一个变量名称,函数声明的优先级高于变量声明的优先级

console.log(fn);
function fn(){"举例3"};
var fn="hello";
console.log(fn);

//输出结果:
ƒ fn(){"举例3"}
hello

总结:

#1:所有的声明都会提升到作用域的最顶上去。

#2:同一个变量只会声明一次,其他的会被忽略掉。

#3:函数声明的优先级高于变量申明的优先级,并且函数声明和函数定义的部分一起被提升。
(0)

相关推荐