美文网首页
函数声明和函数调用

函数声明和函数调用

作者: YM雨蒙 | 来源:发表于2017-09-11 19:33 被阅读15次

函数声明定义函数特点

  • 和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样
  • 用函数声明的方式,重复定义函数,最后一次定义有效

函数实例化定义函数特点

  • 定义的函数只能访问本地作用域和全局作用域

变量前置

console.log(a)   //undefined
var a = 3    

==>等同于

var a
console.log(a)
a = 3

函数声明

console.log(sum(3,5))

function sum(a,b){
  return a + b
}

==>等同于
  

function sum(a,b){
  return a + b
}

console.log(sum(3,5))

函数表达式声明前置

fn()  //"TypeError: fn is not a function(不是一个函数)

var fn = function(){
  console.log('fn...')
}

==>


var fn
fn()

fn = function(){
  console.log('fn...')
}

立即执行函数

立即执行函数可以形成一个作用域,和全局隔开,不会污染全局,另一方面也是防止命名冲突的影响

(function(){
  console.log('我是立即执行函数')
})()

==>
  
var fn = function(){
  console.log('我是立即执行函数')
}
fn()

命名冲突

当在同一个作用域内定义了名字相同的变量和方法的话,会根据前置顺序产生覆盖

var fn = 3;
function fn(){}

console.log(fn); // 3

==>

var fn
function fn(){}  //覆盖上面的

fn = 3  //重新赋值
console.log(fn)

console.log(fn); // 3

function fn(){}
var fn = 3;

==>
function fn(){}  
var fn  //已经声明的值不会变

console.log(fn)  //fn(){}
fn = 3  

递归

简单来说就是自己调用自己

function factorial(n){
  if(n === 1){
    return 1
  }
  return n * factorial(n-1) 
}
alert(factorial(3))

//缺点:效率低

函数调用

  • 函数调用模式
    • 函数名()
  • 方法调用模式
var myNumber = {
 value: 1,
 add: function(i){
  console.log(this);
  this.value += i;
  }
}
myNumber.add(1);
  • 构造函数调用模式
    • new Function(...)首字母大写
  • apply(call)调用模式
    • apply是function构造函数原型上的构造方法
      • 实现函数借用的功能,把函数借用给对象

函数调用模式的区别-this

  • 函数调用模式
    • this指向window的全局对象
//例子:
function add(i,j){
  console.log(this);  //Window
  // console.log(arguments);
  var sum = i+j;
  console.log(sum);
  (function(){
    console.log(this);  //Window
  })()
  return sum;
}
add(1,2);
  • 方法调用模式
    • this指向调用者
//例子:
var myNumber = {
  value: 1,
  add: function(i){
    console.log(this);  //Object{value: 1, add: ƒ}
    this.value += i;
  }
}
myNumber.add(1);
  • 构造函数调用模式
    • this指向被构造的函数
//例子:
function Car(type,color){
  this.type = type;
  this.color = color;
  this.status = "stop";
  this.light = "off";
  console.log(this);  //打印结果是我们创建的对象
}
Car.prototype.start = function(){
  this.status = "driving";
  this.light = "on";
  console.log(this.type + " is " + this.status);
}
Car.prototype.stop = function(){
  this.status = "stop";
  this.light = "off";
  console.log(this.type + " is " + this.status);
}
var benz = new Car("benz", "black");  //Car {type: "benz", color: "black", status: "stop", light: "off"}
  • apply(call)调用模式
    • this指向第一个参数

函数传参

  • 原始类型按值传递-call by value
var count = 1;
var addOne = function(num) {
    num += 1;
    return num;
}
var ret = addOne(count);
console.log(ret);  //2
console.log(count);  //1结果没有受到影响
  • 对象类型按共享传递-call by sharing
//例子一:
var count = {a:1,b:1};
var addOne = function(obj) {
    obj.a += 1;
    obj.b += 1;
    return obj;
}
var ret = addOne(count);
console.log(ret);  //{a: 2, b: 2}
console.log(count);  //{a: 2, b: 2}

//例子二:
var count = {a:1,b:1};
var addOne = function(obj) {
    obj = {a:2, b:2};
    return obj;
}
var ret = addOne(count);
console.log(ret);  //{a: 2, b: 2} 
console.log(count);  //{a: 1, b: 1}
函数传参

相关文章

  • 函数声明和函数调用

    函数声明定义函数特点 和变量的声明会前置一样,函数声明同样会前置,如果我们使用函数表达式那么规则和变量一样 用函数...

  • 函数及其作用域

    1. 函数声明和函数表达式有什么区别 是否限制函数调用位置? 函数声明:即在代码中声明一条函数,函数调用可以在声明...

  • 16. 函数与作用域

    函数声明和函数表达式的区别 函数声明 声明不必放在调用的前面 函数表达式 声明必须放到调用的前面 变量与函数的声明...

  • swift函数与闭包

    一:声明函数,调用函数: 使用func 来声明一个函数,使用名字和参数来调用函数,使用->来制定函数返回值。形式:...

  • JS函数作用域链

    1.函数声明和函数表达式 函数声明和函数表达式都可以声明函数,但使用函数声明的方法,声明不必放在调用前;使用函数表...

  • 函数声明及其用法

    函数声明: 例子:声明一个函数 传统方法调用函数: 调用成员函数: 注意:成员函数调用通过点表示法 函数参数: 具...

  • JavaScript函数(26)

    函数 函数的声明 如何调用函数 什么call stack this 和arguments 作用域 闭包 函数声明的...

  • 函数与作用域

    1. 函数声明和函数表达式有什么区别 函数声明: 声明不必放到调用的前面 函数表达式: 声明必需放到调用的前...

  • task3

    1.函数声明和函数表达式有什么区别 函数声明 函数声明不必放到调用之前 函数表达式 声明必须放到调用之前 2.什么...

  • js函数和原型对象

    函数提升(Hoisting):函数可以在声明之前调用 自调用函数、函数声明、函数表达式、匿名函数、箭头函数: 自调...

网友评论

      本文标题:函数声明和函数调用

      本文链接:https://www.haomeiwen.com/subject/nbumdxtx.html