JavaScript  函数语法详解

目录
  • 一、普通函数
  • 二、箭头函数
  • 三·、数据包 JSON
  • 四、对象Object
  • 五、Promise
  • 六、Async : Await
  • 七、包
  • 总结

一、普通函数

js的函数创建比较特殊,有很多种方式,最简单的一种和c语言类似。

特点:

函数名字可以除了字母、数字、下划线外,还可以存在 “$” 字符。

在js中,函数名就是一个储存函数对象的变量。使用 typeof 关键字可以查看函数类型。(这个理念和python类似,可以用其他变量接手这个函数)

函数形参定义时不需要写关键字:var、let、const。应该默认就是局部可修改变量。

JS 语法中 不检查输入参数。这意味着,输入参数可少可多。少了输入undefined代替,多了自动忽略。

同上理,JS 也不拘束是否有返回值,统一都有返回值。如果没有写明返回值,则统一返回无效值。

// 1. Function Definition
function printHello_1$_(name_0)
{
    // execution
    console.log("Hello World!" + name_0);
}
console.log(typeof printHello_1$_);
// 2. Function Invocation
printHello_1$_();
// 3. Function Naming
// 4. Function Parameters
// 5. Function Return

js还支持匿名函数,就是不写函数名。python中也有类似,在python学习笔记中也有记录:lambda匿名函数。

// 6. 函数还可以没名字,直接这样创建。
let him = function(){
    console.log("him");
}
him() // 侧面反映了,名字其实就是一个变量名。
// 8. 函数名字本身不支持传递赋值,但是变量可以。
// him = printHello_1(); // 报错(有点类似数组定义后就不能再赋值?)
let add = him;
add();
// 7. 该变量还是可以赋值其他内容。
him = 6;
console.log(him) // 输出数字 6

二、箭头函数

js中箭头函数就是“名副其实”的匿名函数了,可快速创建嵌套函数功能体(自创用词)……也更加贴合python的lambda匿名函数用法。

在看实战案例时全是这种匿名函数的创建和传参,第一次接触懵逼得不要不要的。下面的代码为了方便看效果,我会把用不到的部分改成假,屏蔽运行。你问为什么不直接注释?因为想锻炼用法。

使用方法看似简单,前面括号就是用到的参数,箭头后面紧跟代码。如果是单行的简易代码可不用写括号,单行还自带隐式返回计算值。

if (false)
{
    const add = (a, b) => a + b; // 类似直接创建函数,并且将该函数丢给一个变量调用。
    console.log(add(1,3)); // 没有写返回值,还隐式返回了计算值
}
if (false)
{
    let add = (a, b) => a + b;
    console.log(add(1,3)); // 打印 4
    const add_0 = add; // 可以正常的变量赋值替换
    add = 5; // 可以看出本质还是变量,如果定义是使用可变类型,则可以改变
    console.log(add); // 打印 5
    console.log(add_0(2, 4)); // 打印 6
}
if (false)
{
    console.log(add_0(10, 4)); // const 变量类型不可以跨作用域
}

如果是需要换行,就需要用大括弧。常用。

if (false)
{
    const add = (a, b) =>
    {
        return a + b;
    }
    console.log(add(1,3));  // 有返回值,表示如果用了大括号可以表示换行但是不会有隐式返回。而单行总是会有隐式返回的。
}

三·、数据包 JSON

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。【截至百科】

  • 在之前学习神经网络和ros时也有接触这类数据包,一个小小的后缀.json文件,装着一堆参数或数据集。从格式上看,很像字典,有键和值成对。如果展开图形化,其实是一个列表,有表头和数据。
  • js提供Object类来创建json对象。(其实就是创建对象,下一节再细说)
// 例子1
if (false)
{
    const book = new Object({title : "1984", author : "George Orwell"}) // 创建 JSON 对象
    console.log("\n ---------")
    console.log(typeof book) // 查看类型,确实是对象
    console.log(book) // 能正常打印
}
// 例子2(下一节细说,对象的知识点)
if (false)
{
    const book = ({title : "1984", author : "George Orwell"}) // 就算不加关键词 Object 也能有相同效果。
    console.log("\n ---------")
    console.log(typeof book)
    console.log(book)
}
// 例子3
if (false)
{
    const book = [
        {title : "1984", author : "George Orwella"},
        {title : "1985", author : "George Orwellb"},
        {title : "1986", author : "George Orwellc"},
        {title : "1987", author : "George Orwelld"}
    ]
    console.log("\n ---------")
    console.log(typeof book) // 打印类型还是对象 object,但是实际上一个算是数组
    console.log(book)
}
  • js提供将json对象数据转换为字符串的方法:JSON.stringify()。
if (false)
{
    const book = ({title : "1984", author : "George Orwell"}) // 就算不加关键词 Object 也能有相同效果。
    console.log("\n ---------")
    let bookJSON = JSON.stringify(book); // 将对象保留原本格式,转换为了字符串,其中键名变成了字符串(就是加了双引号)?方便用于保存在文本内?
    console.log(typeof bookJSON) // 想起来,JSON不也是之前我写ros工程时用到的参数文件吗,还有百度飞浆的文本文件都是这种格式。
    console.log(bookJSON)
}
/* 输出内容如下:
 ---------
string
{"title":"1984","author":"George Orwell"}
*/
// 可以发现键值还是原本的字符串,但是键名已经变换为字符串

我做了一个类比实验,看如下注释。

if (false)
{
    const book = ([1,23,3,"156"])
    console.log("\n ---------")
    console.log(typeof book) // 类型依旧属于 object
    let bookJSON = JSON.stringify(book); // 依旧可以调用,不会出现报错。
    console.log(typeof bookJSON) // 得到的结果 和原结果一模一样的字符串。
    console.log(bookJSON)
}
/* 输出内容如下:
 ---------
object
string
[1,23,3,"156"]
*/
// 可以发现函数好像没有起到作用。判断格式不符合json要求时不会起作用,也不会报错。

js提供将字符串数据转换为json对象的方法:JSON.parse()。就是JSON.stringify()的逆操作了。

if (false)
{
    let data_0 = "[1,2,3]";
    let data = "{\"title\" : \"1984\", \"author\" : \"George Orwell\"}"; // 注意,JSON的字符串形式下,键和值都是要加双引号的,弄成类似字符串的形式。有一点不对都会转换失败。
    let parsed = JSON.parse(data); // 逆向操作,将字符串再变回成对象类型。会解析是否符合格式。
    console.log("\n -----")
    console.log(parsed); //
    console.log(typeof parsed)
    console.log(typeof data)
}
/* 输出内容如下:
 -----
{ title: '1984', author: 'George Orwell' }
object
string
*/
// 需要注意的就是字符串中的斜杆表示比较麻烦
  • 学习JSON格式数据的使用非常重要,json变量其实并非普通的数据,而是包含众多数据处理函数的对象。比如上述2个字符串和数据之间相互转换的函数,检查在实战中用到。分别是读取数据和存储数据的2个操作。

四、对象Object

js中的对象创建不同于python的类,而是直接创建对象。我直接看例子,结合例子展开。

if (false)
{
    let data_0 = "[1,2,3]";
    let data = "{\"title\" : \"1984\", \"author\" : \"George Orwell\"}"; // 注意,JSON的字符串形式下,键和值都是要加双引号的,弄成类似字符串的形式。有一点不对都会转换失败。
    let parsed = JSON.parse(data); // 逆向操作,将字符串再变回成对象类型。会解析是否符合格式。
    console.log("\n -----")
    console.log(parsed); //
    console.log(typeof parsed)
    console.log(typeof data)
}
/* 输出内容如下:
 -----
{ title: '1984', author: 'George Orwell' }
object
string
*/
// 需要注意的就是字符串中的斜杆表示比较麻烦

从格式可以看出,感觉是一堆属性,有字符串,有匿名函数。而且不是用等于号而是用冒号赋值,就像字典的键对一样。

所以现在看来,其实json数据包,在js中相当于对象的存在。如果是直接打印函数方法,会输出类似字符:[Function (anonymous)]。

除了一开始直接赋值,也可以采用先创建空对象,再逐步添加值。如果已经存在的属性会覆盖,否则就当作是添加。(很简单粗暴)

// 2. 另一种创建对象的方法,使用构造函数创建
if (false)
{
    const book = new Object();
    console.log(book); // 一开始创建是空的
    console.log(typeof book); //类型是 object
    book.title = "1984";
    book.author = "George Orwell";
    book.isAvailable = false; // 添加属性
    book.checkIn = function(){
        this.isAvailable = true;  // 添加方法
    };
    book.checkOut = function(){
        this.isAvailable = false;
    };
     console.log(book); // 打印正常
     console.log(typeof book);
    // 3. 访问对象内元素的方法:
    console.log(book.title); // 类似结构体的访问
    console.log(book["title"]); // 类似字典的访问,输出结果是一样的,注意,这样访问的话,键名一定要加双引号,看作字符串形式
    console.log(book.checkIn); // 如果是访问函数,如果不加括号,会返回对象。打印类似字符:[Function (anonymous)]
    console.log(book.checkIn()); // 如果加括号就相当于调用执行.(返回值空,因为函数内没用写返回值)
    console.log(book["checkIn"]); // 也可以使用字典的形式访问,结果一样
    console.log(book["checkIn"]());  // 就是这个括号是在方括号外面的。
}
  • 上下文机制: this ,并不完全是在对象内值指对象的名字,而是指代上下文使用的变量?(具体看视频讲解,我理解还不太透彻)
  • 类似于我使用的主体,我使用的主体是对象,返回的就是对象,我使用的函数,返回的就是函数。所以this还可以在函数中使用,虽然函数本身也是一个对象(?)。
if (false)
{
    const bookObj = {    			// 创建一个对象
        checkIn : function(){		// 添加一个属性
            return this;			// 这个属性是一个方法,且有返回值,返回对象本身
        }
    }
    function anotherCheckIn(){		// 创建一个函数
        return this;				// 返回一个函数本身
    }
    console.log(bookObj.checkIn() == bookObj); // 返回值是不是对象本身,对的
    console.log(bookObj.checkIn() == globalThis); // 返回值是不是函数,错的
    console.log(anotherCheckIn() == globalThis); // 返回值是不是函数,对的
}

五、Promise

懵逼的一节,讲js中的异步运行机制?不多解释,怕越说越错。

// Promise 对象用于表示一个异步操作的最终完成 (或失败)及其结果值。
if (true)
{
    function promiseTimeout(ms){ // 创建一个函数
        return new Promise((resolve, reject) => { // 返回一个 Promise 对象, 输入参数是一个匿名函数,其中匿名函数又有2个参数,一个是成功时会执行的内容,一个是失败时会执行的内容
            setTimeout(resolve, ms); // js内部函数,延时第二个参数ms后执行 第一个参数的内容。
        });
    }
    promiseTimeout(2000) // 调用函数,传入参数2000ms;
        .then(() => { // 返回的 Promise 对象的内置方法;如果成功则会调用。该内置方法也有一个参数,该参数是匿名函数
            console.log('Done!!'); // 该匿名函数无参入参数,内部功能只有打印
            return promiseTimeout(1000); // 再调用一次函数,又返回一个变量
        }).then(() => { // 因为上面又返回了一个变量,所以可以链式调用,
            console.log('Also done!!'); // 延时1000ms,运行成功后会接着调用
            return Promise.resolve(42); // 又返回一个对象,无限套娃
        }).then((result_0) => { // 传入参数,这个参数名字是随意的,我修改后还是能实现效果。ide自动标红,应该能知道是变量,而非语法关键字
            console.log(result_0); // 打印参数
        })
        .catch(() => { // 同上,不过是失败时调用
            console.log('Error!');
        })
    // 因为 Promise.prototype.then 和  Promise.prototype.catch 方法返回的是 promise, 所以它们可以被链式调用。
}
/*
运行结果为:
先稍等一会打印一行:
Done!
稍等片刻后再同时先后打印两行:
Also done!
42
*/

六、Async : Await

和Promise机制相反。

// Async:Await
function promiseTimeout(ms){
    return new Promise((resolve, reject) => {
        setTimeout(resolve, ms);
    });
}
async function longRunningOperation(){
    return 42;
}
async function run(){
    console.log('Start!');
    await promiseTimeout(2000); // 添加await关键字,结果类似去同步运行。本来使用Promise会使先打印,后延时,如果加上A/A后就会按顺序先延时再打印。
    const response = await longRunningOperation();
    console.log(response); // 按道理应该直接返回42并打印,实际上,如果不加await关键字,会立刻返回一个Promise对象,而不是42.
    console.log('Stop!!');
}
run();
/*
运行结果为:
先打印一行:
Start!
稍等片刻后再同时先后打印两行:
42
Stop!
*/

七、包

使用node.js中附带的nvm工具,可以很好的管理js软件包。而且工程可以配备了相关软件包目录。只需要在其中添加对应软件包,再输入更新工程指令就可以在工程中添加软件包。

类似于编译一样,不过这个是下载。过去python提倡将软件包直接安装在电脑工作环境空间内。而c语言的相关库是建议在工程内。js也是提倡在工程内。不过如果要转移程序时,会讲软件包文件夹删除。只转移工程代码部分。转移完毕后在别的电脑上再使用更新下载功能即可。这个操作有点像之前学过的ros工程。不过ros工程就算不设置正确也能正常运行,js如果设置不准确,在编译时就不通过了。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • JavaScript基础系列之函数和方法详解

    目录 一.函数和方法的区别 二.如何写好一个函数 2.1 命名准确 2.1.1 函数命名 2.1.2 参数命名 2.2 函数注释 2.2.1 参数注释 2.3  函数参数 2.3.1 参数默认值 2.3.2 对象参数 2.3.3 参数数量 2.3.4 参数类型防御 2.4 函数的返回 2.4.1 幂等函数 2.4.2 纯函数 2.4.3 return null 函数和方法的区别 总结 一.函数和方法的区别 函数(function):函数是带有名称和参数的 JavaScript 代码段,可以一次定

  • 浅谈javascript语法和定时函数

    一.JavaScript基本语法. (一)数据类型与变量类型. 整数,小数,布局,字符串,日期时间,数组 强制转换: parseInt() parseFloat() isNaN() (二)数组 var 数组名 = new Array([长度]); //"假冒"数组 a.length-长度 a[下标] = 值. a[下标] (三)函数 复制代码 代码如下: function 函数名(形参) { } function ShowStr(a) { } 二.DOM操作 DOM - Documen

  • JavaScript CollectGarbage函数案例详解

    首先看一个内存释放的实例: <SCRIPT LANGUAGE="JavaScript"> <!-- strTest = "1"; for ( var i = 0; i < 25; i ++ ) { strTest += strTest; } alert(strTest); delete strTest; CollectGarbage(); //--> </SCRIPT> CollectGarbage,是IE的一个特有属性,用

  • JavaScript函数之call、apply以及bind方法案例详解

    总结 1.相同点 都能够改变目标函数执行时内部 this 的指向 方法的第一个参数用于指定函数执行时内部的 this 值 支持向目标函数传递任意个参数 若不向方法的第一个参数传值或者传递 undefined.null,则在 JavaScript 正常模式下,目标函数内部的 this 指向 window 对象,严格模式下,分别指向 undefined.null. 2.区别 apply() 方法可接收两个参数,而 call() 和 bind() 方法则可接收多个参数. apply() 方法向目标函数

  • 100多个基础常用JS函数和语法集合大全

    网站特效离不开脚本,javascript是最常用的脚本语言,我们归纳一下常用的基础函数和语法: 1.输出语句:document.write(""); 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document) 5.得到表单中元素的名称和值:document.getElementB

  • javascript中基于replace函数的正则表达式语法

    示例代码如下: var strM = "javascript is a good script language"; //在此我想将字母a替换成字母A alert(strM.replace("a","A")); [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 它只替换了首字母.但如果加上正则表达式结果就不一样了!replace()支持正则表达式,它可以按照正则表达式的规则匹配字符或字符串,然后给予替换! 注意:被替换的部分不用加双引号

  • JavaScript  函数语法详解

    目录 一.普通函数 二.箭头函数 三·.数据包 JSON 四.对象Object 五.Promise 六.Async : Await 七.包 总结 一.普通函数 js的函数创建比较特殊,有很多种方式,最简单的一种和c语言类似. 特点: 函数名字可以除了字母.数字.下划线外,还可以存在 "$" 字符. 在js中,函数名就是一个储存函数对象的变量.使用 typeof 关键字可以查看函数类型.(这个理念和python类似,可以用其他变量接手这个函数) 函数形参定义时不需要写关键字:var.le

  • JavaScript 函数节流详解及方法总结

    JavaScript 函数节流详解 浏览器一个网页的UI线程只有一个,他同时会处理界面的渲染和页面JavaScript代码的执行(简单扩展一下,浏览器或者JavaScript运行大环境并不是单线程,诸如ajax异步回调.hybrid框架内与native通信.事件队列.CSS运行线程等等都属于多线程环境,不过ES6引入了Promise类来减少了部分异步情况).因此当JavaScript代码运行计算量很大的方法时,就有可能阻塞UI线程,小则导致用户响应卡顿,严重的情况下浏览器会提示页面无响应是否强制

  • python中的map函数语法详解

    目录 1map()函数的简介以及语法: 2map()函数实例: 1 map()函数的简介以及语法: map是python内置函数,会根据提供的函数对指定的序列做映射. map()函数的格式是: map(function,iterable,...) 第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合. 把函数依次作用在list中的每一个元素上,得到一个新的list并返回.注意,map不改变原list,而是返回一个新list. 2 map()函数实例: del squa

  • JavaScript函数表达式详解及实例

    JavaScript函数表达式 一.序 定义函数的方式有两种:一种是函数声明,另一种就是函数表达式: 1.1 函数声明 function functionName(arg){ //函数体 } 关于函数声明,它有一个重要特征就是函数声明提升,意思就是在执行代码之前会先读取函数声明.这就意味着可以把函数放在调用它的语句后面.如下所示: helloworld(); //在代码执行之前会先读取函数声明 function helloworld(){ console.log("hello world&quo

  • JavaScript函数基础详解

    什么是函数? 函数是完成某一功能的代码段 函数是可重复执行的代码段 函数方便管理和维护 自定义函数 通过function关键字 function 函数名称([参数,...]){ 代码段; return 返回值; } 注意 函数名称不要包含特殊字符 函数名称最好含义明确 函数名称最好遵循驼峰标记法或者下划线法 函数名称严格区分大小写 函数名称如果重复会产生覆盖 函数可以有参数也可以没有参数,可以有一个参数也可以有多个参数 函数通过return加返回值,如果没有return 默认返回undefine

  • C语言函数语法详解

    1.概述 在C语言中,函数是来完成子程序或者某个模块的功能.有主程序或者其他函数调用,其他函数之间可以相互调用.同一函数可以被一个或多个函数任意次调用. 注意:     a.一个C程序有一个或多个程序模块组成,每一个程序模块作为一个源程序文件.一个源文件可以为多个C程序共用.     b.程序在编译时是以源文件为单位进行编译,而不是以函数为单位进行编译.一个源文件就是一个编译单元     c.C程序的执行是从main函数开始,也是在main函数中结束整个程序     d.所有函数是平行的,即在定

  • JavaScript 函数用法详解【函数定义、参数、绑定、作用域、闭包等】

    本文实例讲述了JavaScript 函数用法.分享给大家供大家参考,具体如下: 初始函数 Function类型,即函数的类型. 典型的JavaScript函数定义: function 函数名称(参数表){ //函数执行部分 return ; } //注意:参数列表直接写形参名即可 return语句:return返回函数的返回值并结束函数运行 函数也可以看做数据来进行传递 参数列表相当于函数入口,return 语句相当于函数出口 函数可以作为参数来传递. function test ( a ) {

  • JavaScript 函数模式详解及示例

    JavaScript设计模式的作用是提高代码的重用性,可读性,使代码更容易的维护和扩展 在javascript中,函数是一类对象,这表示他可以作为参数传递给其他函数:此外,函数还可以提供作用域. 创建函数的语法 命名函数表达式 //命名函数表达式 var add = function add(a,b){ return a+b; }; var foo = function bar() { console.log(foo === bar); }; foo();//true 可见,他们引用的是同一函数

  • JavaScript函数模式详解

    在javascript中,函数是一类对象,这表示他可以作为参数传递给其他函数:此外,函数还可以提供作用域. js函数基础部分:javascript学习笔记(四)function函数部分 创建函数的语法 命名函数表达式 复制代码 代码如下: //命名函数表达式 var add = function add(a,b){     return a+b; }; 函数表达式 复制代码 代码如下: //又名匿名函数 var add = function(a,b){     return a+b; }; 函数

  • JavaScript中push(),join() 函数 实例详解

    定义和用法 push方法 可向数组的末尾添加一个或多个元素,并返回一个新的长度. join方法 用于把数组中所有元素添加到一个指定的字符串,元素是通过指定的分隔符进行分割的. 语法 arrayObject.push(newelement1,newelement2,....,newelementX) arrayObject.join(separator). 参数描述newelement1必需.要添加到数组的第一个元素.newelement2可选.要添加到数组的第二个元素.newelementX可选

随机推荐