# JavaScript函数2

37 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

函数的特殊情况

返回值 return

  1. 就是只写一个return的,那么表示在函数当中阻止代码的运行

比如:

function fn(){
    console.log("1111111111");
    // return;//return在函数当中阻止代码的运算,return 后面有没有数据都是阻止函数的往后执行
    return 1;   //代码执行到这里就不会往后执行
    console.log(2222222222);
}
fn();
//总结:在函数当中return后面的代码没意义

作用域特殊的情况

在函数外面,在script里面,外面管这一块区域叫做全局作用域 => 里面的变量,外面管他作用全局变量 在函数当中没有使用var关键字声明的变量,叫做全局变量

比如:

function fn(){
    num = 10;//在函数当中没有使用var关键字声明的变量,叫做全局变量,在script都可以访问
}
fn();
console.log(num);

预解析

// 声明式函数
fn();
function fn(){console.log("我是一个fn函数");}
fn();
​
// 赋值式函数
fun()
var fun = function (){console.log("我是一个fun函数");}
fun();
  • 预解析 预解析就是在我们代码执行之前,JS引擎将将我们的代码给扫描一遍(JS将我们的代码通读一遍)
  1. 在定义变量的时候,使用var关键字声明的变量会进行提升(变量的提升),提升的是变量,而不是变量值

比如:

// var a = 10;
// console.log(a); //输出来的结果? 10
​
//-------------
​
console.log(a); // undefined    => 没有被定义
var a = 10;
console.log(a); // 10           => 已经赋值
/*
    预解析
        var a;//将var a 的关键字进行提升,提升的是变量,而不是变量的值
        console.log(a);
        a = 10;
        console.log(a);
*/
  1. 使用var声明的赋值式函数,因为是var关键字声明的,所以他也会对var声明的变量进行提升

比如:

fn();   //fn is not a funtion
var fn = function (){console.log("赋值式函数fn");}
fn();
/*
    预解析
        var fn ;
        fn();//因为fn被提升了,所以是一个undefined,而你使用(),将fn给调用了,undefined调用,所以报了一个错,叫做fn is not a function
        fn = function (){console.log("赋值式函数fn");}
        fn();
​
        //在我们的JS当中,代码一旦出错了之后,代码就不会往后面执行了
*/
  1. 声明函数的预解析,整个函数都进行提升

比如:

fn();
function fn(){console.log("我是一个小小的石头");}
fn()
/*
    预解析:
        function fn(){console.log("我是一个小小的石头");}
        fn();
        fn();
*/

注意: 1.当变量提升与函数提升的名字重复时候,变量的提升被忽略 2.预解析不执行他结果,他知识解析,而不执行 在解析的过程当中碰到有var提升,碰到function 提升

递归

递归就是自己调用自己 => 我们在实际工作当中,不到万不得已,少用递归 ? 因为你的代码有可能会一直处于梦境当中

比如:

/* 盗梦空间 => 盗梦空间小李子 */
function dream(){
    var res = prompt("陀螺停止转动吗? 请回到是 或者 不是") // 回到现实当中那个条件就是陀螺停止的转动
    /* 如果陀螺停止的转动,那么表示回到了现实当中,如果一直转动,那么还在梦境当中 */
    if(res == "是"){ // 回到了显示当中,终止函数,停止了
        alert("恭喜你,回到了现实当中!")
        return;//在函数当中,碰到return,那么代码就会停止
    }else{
        //那就是还没有回到现实当中,就是一直处于梦境里面,那就一直递归
        //递归就是自己调用自己
        dream();
    }
}
/* 调用这个函数 */
dream();

对象

总结:

1. () =>    参数,运算符,调用
2. [] =>    数组
3. {} =>    对象
 => 对象也是一个存储数据的,不同于数组的是,数组当中存储的是有顺序,他的顺序指的就是数组的下标
    对象是没有顺序
    对象存储的格式是 => 键值对 key:value

比如:

//要创建一个对象    //JS当中不是一个纯面向对象的语言
var o = {} //创建好了一个对象 => 对象真正纯面向对象的语言来讲 所有的对象的创建都要new,但是JS,可以不new也有对象
//我们说了,对象也是一个存储数据的
//添加
o.name = "张三"     //添加一个属性,他里面的属性是key:value => name:"张三" => 我们也管name这种叫做属性,"张三"也叫属性值
//添加一个性别
o.sex = "男"
  • 对象
描述一个对象就是要描述一个对象的属性与方法(方法就是他的行为)
    属性就是这个对象身上某一些特征(名词)
        比如:张三,年龄,性别,身高....
    方法就是这个对象身上某一些行为(动词)
        比如:吃,喝,啦,撒

补充:var o = {}=>使用字面量创建对象

  • 使用内置函数创建对象
//创建一个对象
var o = new Object();
//给对象添加属性与属性值
o.name = "文渊";
o.gender = "男";
o.sex = 18;
/* 添加方法 */
o.eat = function(){
    console.log(o.name + "正在吃东西");
}
  • 操作对象的属性
  1. 点语法:

比如:

var o = {
    name:"张三",
    age:18
}
//点语法,用的比较多
console.log(o.name);
  1. 中括号语法:

比如:

var o = {
    name:"张三",
    age:18
}
o["gender"] = "男"

总结: 点语法的应该场景特别的多,一般都是使用点语法 中括号语法应用场景 1.在括号里面使用是变量 2.不规则的属性名词

  • 对象查询 对象的遍历使用的语法叫做 for in 语法

比如:

var o = {
    name:"张三",
    age:18,
    gender:"男"
}
//遍历对象使用是for in语法
for(var key in o){
    console.log(key,o);
}