27函数

2017-12-15  本文已影响4人  joker731

JavaScript 函数重中之重


如何声明一个函数?

  1. 具名函数
    function x(输入1,输入2){
    return undefined
    }
    注意: 变量可以是7种(null undefined boolean string number symbol object)类
    型,但是函数变量是变量的特例.
  1. 匿名函数 var a = function (){} //这是第二种声明方法 var a = function b(){}//这是第三种声明方法

函数第五种声明就是箭头函数


函数的name属性


数据是可以直接用的,但是函数是要调用的

函数到底是什么?

函数内存

  1. 具名函数: function f (x,y){return x+y} f 存一个地址,指向heap一块内存,这块内存存有2个东西.一个是params[x,y] 另外一个就是fbody{return x + y};这块内存又指向Function 函数对象,使用他的call方法
    用内存实现一个函数是怎样的呢?//eval 这是一个把字符串当成代码执行的函数

利用内存原理,写出函数的代码.

var f = {}
f.name = 'f'
f.params= ['x','y']//这个是假设的的属性
f.functionBody='console.log('xxxx')'
f.call = function(){return window.eval(f.functionBody)}
//这里穿插一个知识点,为什么要用函数包装Window......这些代码给f.call而不是直接用? 个人认为应该是用函数有利于扩展,日后更改代码可以直接在函数内增删改查代码,而直接赋值就没有这个功能,而且直接赋值直接给一个值,而不是一个函数地址,两者的内存不一样.
// 这样就清楚了f 与f.call的区别了,f只是一个函数,f.call是执行这个函数体

那么函数的本质我们就知道了:可以执行代码的对象就是函数


什么是this? f.call(undefined,1,2) undefined就是this;[1,2]就是arguments

// call的第一个参数可以用this得到,call后面的参数可以用arguments得到

JavaScript函数调用,stack内存与heap内存的过程

JavaScript中的作用域就是树

-注意一句很错误的话:没有用var 声明的变量,a =3 声明的就是全局作用域的变量a,这是很错误的话. 首先a=3是一个赋值语句,他是赋值给a,但是当前作用域没有,就会沿着作用域链网上找,直到找到a赋值给他.如果没有a,也就是说整个作用域都没有,就会声明一个a并赋值给他,这时候才是叫 声明了一个全局作用域a,并赋值3给他.

上一篇 下一篇

猜你喜欢

热点阅读