函数是一个特殊的对象

  • 具名函数
  • function 函数名(形式参数1,形式参数2){
    语句
    return 返回值
    }
  • 匿名函数
  • 上门的具名函数,去掉函数名就是匿名函数
  • let a =function(x,y){return x+y}
  • 也叫函数表达式

匿名函数

let a = function (x,y){return x+y
}

函数fn

 function fn(x,y){return x+y
}

报错

fn能作用域只能是等于号右边

  • 箭头函数
  • let f1 = x => x*x
  • 输入参数 输出参数
  • let f2 = (x,y) => x+y // 圆括号 不能省
  • let f3 = (x,y) => {return x+y} // 有两件事情 花括号不能省 一定要写 return
  • let f4 = (x,y) => ({name:x,age:y})
  • 直接返回对象会出错,需要加个圆括号(头疼)
  • 用构造函数
  • let f =new Function('x','y','return x+y')
  • 基本没人用,但是能让你知道函数是谁构造的
  • 所有函数都是Function 构造出来的
  • 包括 object Array Function 也是
  • 函数自身 vs 函数调用
  • fn v.s fn()

函数自身

  • 代码
  • let fn =() => console.log('hi')
  • fn
  • 结果
  • 不会有任何结果
  • 因为fn没有执行(调用)

函数调用

  • 代码
  • let fn = () => console.log ('hi')
  • fn()
  • 结果
  • 打印出hi
  • 有圆括号才是调用

在进一步

  • 代码
  • let fn =() => console.log('hi')
  • let fn2 = fn
  • fn2()
  • 结果
  • fn保存了匿名函数的地址
  • 这个地址被复制给了fn2
  • fn2()调用了匿名函数
  • fn和fn2都是匿名函数的引用,真正的函数既不是fn也不是fn2

函数的要素

  • 每个函数都有这个东西
  • 调用时机
  • 作用域
  • 闭包
  • 形式参数
  • 返回值
  • 调用栈
  • 函数提升
  • arguments(除了箭头函数)
  • this (除了箭头函数)

调用时机---时机不同,结果不同--刻舟求剑

例子1

  • 代码
  • let a =1
  • function fn(){
    console.log(a)
    }
  • 答应出多少
  • 不知,因为没有调用代码

例子2

  • 代码
  • let a =1
  • function fn(){
    console.log(a)
    }
  • fn()
  • 打印出多少
  • 1

例子3

  • 代码
  • let a = 1
  • function fn(){
    console.log(a)
    }
  • a=2
  • fn()
  • 问打印出多少
  • 2

例子4

  • 代码
  • let a =1
  • function fn(){
    console.log(a)
    }
  • fu()
  • a=2
  • 问打印出多少
  • 答1

例子5

  • 代码
let a =1
function fn(){setTimeout(()=>{
console,log (a)
},0)
}fn()
a=2
请问打印出多少
答
2

例子6

let i = 0
for(i =0;i<6;i++){setTimeout(()=>{console.log(i)
},0)
}
问打印出多少
答
不是 0,2,3,4,5
而是6个6

例子7

for(let i = 0;i<6;i++){setTimeout(()=>{console.log(i)
},0)
}
问答应出多少
答
是0,1,2,3,4,5
因为js在for和let一起用的时候回加东西
每循环回多创建一个i

作用域 --每个函数都会默认创建一个作用域

例子
function fn(){let a =1
}
console.log(a) // 不存在
问
是不是因为fn没执行导致
答
就算fn执行了,也访问不到作用域里面的a

例子2

function fn(){let a =1
}fn()
console.log(a) // a还是不存在

全局变量v,s 局部变量

在顶级作用域声名的变量是全局变量

window 的属性是全局变量

其他都是局部变量

函数可嵌套,作用域可以嵌套

作用域规则

  • 如果多个作用域有同名变量a
  • 那么久查找a的声名是,就向上去最近的作用域
  • 简称 就近原则
  • 查找a 的过程与函数的执行有关

例4

function f1(){let a =1function f2(){let a = 2                           如果一个函数用到外部的变量function f3(){                      那么这个函数加这个变量 就叫做闭包console.log(a)                      左边的a和f3组成了闭包}a=22f3()
}
console,log(a)
a = 100f2()
}
f1()

形式参数

  • 形式参数的意思就是非实际参数
  • function add(x,y){
    return x+y
    }
  • //其中x和y就是形式参数,因为并不是实际的参数
  • add(1,2)
  • // 调用 add 时,1和2是实际参数,会被赋值给x y
  • 形参可以认为是变量声明
  • // 上门代码近似等价于下面的代码
  • 上面代码近似等价于下面代码
  • function add(){
    var x = arguments[0]
    var y =arguments[1]
    return x+y
    }

形参可多可少 ---形参只是给参数取名字

返回值

  • 每个函数都有返回值
  • function hi(){ console.log('hi')}
  • hi ()
  • 没写 return ,所以返回值是 undefined
  • function hi(){return console .log )('hi')}
  • hi()
  • 返回值为 console.log('hi')的值 即undefinded
  • 函数执行完后才会返回
  • 只有函数有返回值
  • 1+2 返回值为3 错误 口误
  • 1+2 值为 3 正确

调用栈

  • 什么是调用栈
  • js引擎在调用一个函数前
  • 需要把函数所在的环境 push 到一个数组里
  • 这个数组叫调用栈
  • 等函数执行完了,就会把环境弹出(pop)出来
  • 然后return到之前的环境,继续执行后续代码
  • 举例
  • console.log(1)
  • console.log('1+2的结果为'1+2的结果为'+add(1,2))
  • console.log(2)

递归函数

  • 阶乘
  • function f(n){
    return n! == 1? n* f(n-1):1
    }
  • 1=1
  • 2=2*1=2
  • 3=3*2=3*2*1=6
  • 4=4*3=24
  • 理解递归
  • f(4)
  • =4*f(3)
  • =4*(3*f(2))
  • =4*(3*(2*f(1)))
  • =4*(3*(2*(1)))
  • =4*(3*(2))
  • =4*(6)
  • 24
  • 先递进,再回归

爆栈---如果调用栈中压入的帧过多,程序就会崩溃

函数提升

  • 什么是函数提升
  • function(){}
  • 不管你把具名函数什么在哪里,他都会跑到第一行
  • 什么不是函数提升
  • let fn =function(){}
  • 这是赋值,右边的匿名函数声明不会提升

arguments 和 this ---,每个函数都有,除了箭头函数

  • 代码
  • function(){ console.log(arguments)console.log(this)}
  • 如何传 arguments
  • 调用 fn 即可传 arguments
  • fn(1,2,3)那么 arguments 就是[1,2,3]伪数组
  • 如何传this
  • 目前可以用fn.call(xxx,1,2,3)传 this 和 arguments
  • 而且xxx会被自动转化成对象(js的糟粕)

箭头函数 ---没有 arguments 和this

  • 里面的this 就是外面的this
  • console.log(this)//window
  • let fn =()=>console.log(this)
  • fn()//window
  • 就算你加call都没有
  • fn.call({name:'frank'})//window

立即执行函数

  • 原理
  • ES5时代,为了得到局部变量,必须引入一个函数
  • 但是这个函数如果有名字,就得不偿失
  • 于是这个函数必须是匿名函数
  • 声名匿名函数,然后立即加个()执行它
  • 但是js标准认为这种语法不合法
  • 所以js程序员寻求各种方法
  • 最终发现,只要在匿名函数前加个运算符号即可
  • !,~,(),+,-都可以
  • 但是这里面有些运算符会往上走
  • 所以推荐永远用!来解决

android 调用js怎么获取返回值_js 函数相关推荐

  1. Android WebView 调用JS方法获取返回值

    一.Android4.4+ 如果你项目的minSdkVersion 为4.4 以上,那么你可以直接通过WebView的evaluateJavascript()方法 拿到JS方法的返回值 webview ...

  2. oracle java存储过程返回值_java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)...

    java程序调用Oracle 存储过程 获取返回值(无返回,非结 果集,结果集) oracle中procedure是不能有返回值的,要想返回值,就得有 输出参数,同样要想返回记录集,可以把游标类型作为 ...

  3. c++ 调用python2类获取返回值

    vs2017好像没有 PyObject* PyIns = PyInstance_New(pyCls, NULL, NULL); // 创建tester类 前面介绍了用python调用C++时用swig ...

  4. [Python陷阱]os.system调用shell脚本获取返回值

    当前有shell个脚本/tmp/test.sh,内容如下: #!/bin/bash exit 11 使用Python的os.system调用,获取返回值是: >>> ret=os.s ...

  5. python获取返回值_python 调用 shell ,获取返回值和返回信息

    网络上有各种方案解决python调用shell的解决方案,但是没有一个完美的,以下是本人整理的一个方案,比较完美地解决了同时解决获取返回值和返回信息. def run_linux_cmd_quiet( ...

  6. java程序调用Oracle 存储过程 获取返回值(无返回,非结果集,结果集)

    oracle中procedure是不能有返回值的,要想返回值,就得有输出参数,同样要想返回记录集,可以把游标类型作为输出参数. 下面是详细情况说明: 一:无返回值的存储过程调用 存储过程: creat ...

  7. oracle 异常返回值,oracle - java.sql.SQLException:无效的列类型:调用具有行类型返回值的函数时为1111 - 堆栈内存溢出...

    我在一个名为" MyPackage"的Oracle软件包中有一个函数: FUNCTION MyFunction(name IN VARCHAR2) RETURN MyTable%r ...

  8. Android开发-WebView中实现Android调用JS JS调用Android 【三】

    老早之前就想总结下Webview相关的知识点了,因为互联网大潮中,很多APP都会使用到Webview,像那些不计其数的电商APP,无一例外的使用Webview:或者一些非电商APP中的像广告页面,注册 ...

  9. 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

    文章目录 前言 一.x86 架构的返回值获取 二.ARM 架构远程调用 前言 在之前的博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 ...

最新文章

  1. iOS Sprite Kit教程之场景的设置
  2. python 实现 softmax
  3. 计算机及其系统的泄密渠道之三
  4. TensorFlow——[基本图像分类]fashion-mnist及mnist_reader.py运行错误[TypeError: Invalid dimensions for image data]
  5. matlab全域基函数,多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]...
  6. 数据告诉你,抖音是怎么在半年之内逆袭的
  7. 信安精品课:第1章网络信息安全概述精讲笔记
  8. 【华为云技术分享】【DevCloud · 敏捷智库】项目团队人员变动频繁,如何对新人进行有效培养和管理?
  9. 【机器学习】集成学习--Stacking
  10. Sublime text的必要配置
  11. iOS 6的Rotation
  12. 基于tensorflow 批量修改自己的图片数据集 (附代码)
  13. tf-openpose人体姿态估计标签生成--heatmap--vectormap
  14. 怎样保存CAD图纸到电脑桌面呢?
  15. 中安网培***入门教程
  16. Linux部署-elasticsearch7.6.1
  17. kiriki模拟器Android9,Kirikiroid2模拟器
  18. HTML两张图片翻转,canvas实现图片镜像翻转的2种方式
  19. Java实现 已知ListString list = new ArrayListString();list .add(张三丰,北京);......要求:求出每个地区有多少人,都是谁?
  20. C语言——将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

热门文章

  1. 强行分类提取特征自编码网络例4
  2. pytorch ctcloss 参数详解
  3. opencv-python视频处理之录制视频
  4. 为什么说百度教育大脑3.0,是中国教育迎来的真正智慧大脑?
  5. PHP mac xdebug配置
  6. 函数式编程(小练习)
  7. Git中忽略文件权限或文件拥有者的改变
  8. 我的阿里梦——淘宝前端必备技能
  9. sleep() wait() notify/notifyAll() 的区别
  10. Silverlight游戏设计(Game Design):(五)面向对象的思想塑造游戏对象