函数

函数的声明方式:

function fn(){} //具名函数
var f = function (){} //匿名函数,必须将其赋给一个变量,这种形式称为函数表达式
var f = fucntion fn(){} //具名函数,函数表达式
var f = new Function('x', 'y', 'return x+y') //构造函数声明,最不常用
var f = ()=>{} //箭头函数

//对于var f = fucntion fn(){}这种形式的,只能通过f()调用
var f = function fn(){console.log('hello')}
fn() //报错
f() //hello

函数的本质

请看下面代码

//这是一个求三角形面积的函数
function area (width, height){
  s = width*hegiht.2
  return s
}

当我们每次需要求三角形面积的时候,调用这个函数即可,需要就用
所以,函数的本质就是可以反复调用的代码块,并且可以接受参数,结果会根据参数的不同而改变


this、arguments

this表示属性当前所在的对象

var obj = {
  n: 1,
  fn: function(){
    console.log(this.n)
  }
}
obj.fn() //1
obj.fn,call(obj) //1
obj.fn.call()  //undefined
var n = 2
obj.fn.call()  //2

call可以改变this的指向,this就是call的第一个参数,在非严格模式下,call的第一个参数为空或为undefined,this默认指向window

function fn(){
  console.log(this)
  console.log(this === window) 
}
fn.call()
//Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, frames: Window, …}
//true

在严格模式下,call的第一个参数是什么this就是什么

function fn(){
  'use strict'
  console.log(this)
  console.log(this === window) 
}
fn.call()
//undefined
//false
fn.call(123)
//123
//false

arguments就是函数接收的参数,是一个伪数组,因为它的原型链没有Array.prototype这一环

function f(){
    console.log(arguments)
}
fn(1,2,3,4) //Arguments(4) [1, 2, 3, 4, callee: ƒ, Symbol(Symbol.iterator): ƒ]

作用域、变量提升

每个函数都有自己单独的作用域,并且在函数内部也会发生变量提升。

函数内部的变量提升

  • var命令声明的变量,不管在什么位置,变量声明都会被提升到函数体的头部

函数作用域问题

  • 若一个函数内部有子函数,代码如下
var a = 1
function f1(){
  var a = 2
  console.log(a)  //优先在f1范围内查找a,若找不到a向上查找(也就是全局范围),不会想下查找
  f2()
  function f2(){
    var a = 3
    console.log(a)
  }
}
f1()  //2 3
console.log(a)  //1

此时的作用域是这样的:


image.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 10,246评论 0 5
  •   函数表达式是 JavaScript 中的一个既强大有容易令人困惑的特性。定义函数的的方式有两种: 函数声明; ...
    霜天晓阅读 4,276评论 0 1
  • 2018-6-28复习每一次回头看基础,都有新的理解 Function.prototype.call 函数实例的c...
    woow_wu7阅读 3,269评论 0 0
  • 函数只定义一次,但可能被执行或调用任意次。JS函数是参数化的,函数的定义会包括一个称为形参的标识符列表,这些参数在...
    PySong阅读 2,726评论 0 0
  • 花溪映雪阅读 1,864评论 0 2

友情链接更多精彩内容