JavaScript(函数,作用域和闭包)(上)

简介: JavaScript(函数,作用域和闭包)

一,什么是函数

类似于Java中的方法,是完成特定任务的代码语句块

特点

使用更简单

不用定义属于某个类,直接调用执行

分类

系统函数

自定义函数

1.1,常用系统函数

1.将字符串转换为整型数字

parseInt("字符串");
<body>
    <input type="button" value="求和" onclick="qiuhe()">
</body>
<script>
  var num1 = parseInt("56.64");      //返回值为56
  var num2 = parseInt("123abc");   //返回值为123
  var num3 = parseInt("hello999"); //返回值为NaN
  console.log(num1,num2,num3);
   function qiuhe(){
       var n1 = prompt("请输入第一个数")
        var n2 = prompt("请输入第二个数")
        var num1=parseInt(n1)
        var num2=parseInt(n2)
        if(isNaN(num1)||isNaN(num2)){
            alert("有一个不是数字");
        }else{
            document.write(num1+num2)
        }
    }
</script>

js示例1

从下标为0起,依次判断每个字符是否可以转换为一个有效数字

如果不是有效数字,则返回NaN,不再继续执行其他操作

如果是有效数字,则该函数将查看下标为1的字符,进行同样的测试,直到发现非有效数字的字符或全部检测完为止

2.将字符串转换为浮点型数字

parseFloat("字符串");
var num1 = parseFloat("3.1415926");  //返回值为3.1415926
var num2 = parseFloat("123abc");       //返回值为123
var num3 = parseFloat("hello999");     //返回值为NaN
var num4 = parseFloat("52.18.97");     //返回值为52.18 如果有两个小数点则第二个小数点无效
console.log(num1,num2,num3);

3.检查其参数是否是非数字

isNaN(x);
var num1=isNaN("20.5");       //返回值为false
var num2=isNaN("123abc");  //返回值为true
var num3=isNaN(48.98);       //返回值为false
console.log(num1,num2,num3);


通常,使用isNaN()函数检测parseInt()和parseFloat()的运算结果,判断它们表示的是否是合格的数字;也可以使用isNaN()函数检测

操作数是否有错误,例如:用0作为除数的情况


1.2,函数声明

由关键字function、函数名、一组参数及置于括号中的待执行的JavaScript语句组成

语法

    // JavaScript是弱数据类型,对于函数参数没有类型检查和类型限定
  function 函数名([参数1[, 参数2[, 参数3,…] ] ]) {
      //JavaScript语句;
      [return 返回值] // return可有可无
  }

调用函数

// 一般和表单元素的事件一起使用
事件名=“函数名([参数值1[, 参数值2[, 参数值3,…] ])";

函数声明——调用无参函数

// 定义并调用无参函数,输出5次“你好”
<body>
  //单击此按钮时,调用函数func1( ),执行函数体中的代码
    <input type="button" value="点我执行" onclick="func1()">
</body>
<script>
    function func1(){
        for(var i=0;i<5;i++){
            document.write("<h1>你好"+i+"</h1>")
        }
    }
</script>

js示例2

函数声明——调用有参函数

  // 键盘接受“你好”输出行数,并按指定数字输出到网页
 <body>
    <input type="button" value="点我执行" onclick="func1(prompt('请输入显示你好的次数:'))">
</body>
<script>
    function func1(count){
        for(var i=0;i<5;i++){
            document.write("<h1>你好"+i+"</h1>")
        }
    }
</script>

js示例3

1.3,函数表达式

将函数赋给变量

定义函数

var 变量 = function([参数值1[, 参数值2[, 参数值3,…] ]) {
    //JavaScript语句;
};

调用函数

变量([参数值1[, 参数值2[, 参数值3,…] ]);

函数表达式

  // 使用函数声明的方式定义两个函数名都为f1()的函数
      f1();
    function f1(){
        var num3 = 100;
        console.log(num3)
    }
    function f1(){
        console.log("今天天气很好!")
    }
    f1();
    function f1(){
        console.log("今天天气好晴天,处处好风光");
    }
    f1();

  // 使用函数表达式方式定义两个函数名都为f2()的函数
      var f2 = function(){
        console.log("哇~");
    }
    f2();
    var f2 = function(){
        console.log("娃哈哈~");
    }
    f2();


使用函数声明方式定义两个同名的函数时,后面的函数将会覆盖前面的函数;

使用函数表达式方式定义同名的函数时,会从上到下,逐行执行代码,并输出结果

二,预解析

顾名思义就是提前解析代码

主要完成两项工作

其一,变量的声明会提前

其二,函数的声明也会被提前

// 预解析可以把变量的声明提前
console.log(num); //undefined
var num=10;
// 预解析可以把函数的声明提前
f1();
function f1() {
    var num=100;
    console.log(num); //100
}

2.1,函数自调用

自定义函数分类

命名函数

匿名函数

语法

(function() {
  //函数体     
})();

匿名函数的特点

函数没有名字,在声明的同时便直接调用

好处

同名函数之间不会有冲突

    (    function(){
        console.log("立即执行函数");
    })();

2.2,回调函数

注意

如果没有指定回调函数的名称,则称之为 匿名回调函数

    function f1(fn){
        console.log("f1");
        fn()
    };
    function f2(){
        console.log("f2");
        return 1
    };
    f1(f2); // 执行命名回调函数,注意f2后面不能加()

    function f1(fn){
        console.log("f1");
        fn()
    };
    f1(function(){ // 匿名函数
        console.log("我没有名字!");
    })


相关文章
|
6月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
284 19
|
10月前
|
前端开发 JavaScript Java
JavaScript闭包深入剖析:性能剖析与优化技巧
JavaScript 闭包是强大而灵活的特性,广泛应用于数据封装、函数柯里化和事件处理等场景。闭包通过保存外部作用域的变量,实现了私有变量和方法的创建,提升了代码的安全性和可维护性。然而,闭包也可能带来性能问题,如内存泄漏和执行效率下降。为优化闭包性能,建议采取以下策略:及时解除对不再使用的闭包变量的引用,减少闭包的创建次数,使用 WeakMap 管理弱引用,以及优化闭包结构以减少作用域链查找的开销。在实际开发中,无论是 Web 前端还是 Node.js 后端,这些优化措施都能显著提升程序的性能和稳定性。
251 70
|
8月前
|
存储 JavaScript 前端开发
|
8月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
10月前
|
自然语言处理 JavaScript 前端开发
当面试官再问我JS闭包时,我能答出来的都在这里了。
闭包(Closure)是前端面试中的高频考点,广泛应用于函数式编程中。它不仅指函数内部定义的函数,还涉及内存管理、作用域链和垃圾回收机制。闭包可以让函数访问其外部作用域的变量,但也可能引发内存泄漏等问题。通过合理使用闭包,可以实现模块化、高阶函数和回调函数等应用场景。然而,滥用闭包可能导致代码复杂度增加、调试困难以及潜在的性能问题。为了避免这些问题,开发时应谨慎处理闭包,避免不必要的嵌套,并及时清理不再使用的变量和监听器。
435 16
当面试官再问我JS闭包时,我能答出来的都在这里了。
|
10月前
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
236 32
|
9月前
|
缓存 自然语言处理 JavaScript
JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
闭包是JavaScript中不可或缺的部分,它不仅可以增强代码的可维护性,还能在模块化、回调处理等场景中发挥巨大作用。然而,闭包的强大也意味着需要谨慎使用,避免潜在的性能问题和内存泄漏。通过对闭包原理的深入理解以及在实际项目中的灵活应用,你将能够更加高效地编写出简洁且功能强大的代码。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
9月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
存储 缓存 自然语言处理
掌握JavaScript闭包,提升代码质量与性能
掌握JavaScript闭包,提升代码质量与性能
|
自然语言处理 JavaScript 前端开发
深入理解JavaScript中的闭包(Closures)
深入理解JavaScript中的闭包(Closures)