JavaScript函数_函数作用域

简介: 版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/55670174 Function在JavaScript中函数是一种对象,函数名是指向对象的引用。
版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/55670174

Function在JavaScript中函数是一种对象,函数名是指向对象的引用。可以用一下方式调用它

var fun = new Function(“参数”,”返回值”,”函数体”);

因此如果出现下面这种情况,就已很好理解了。第二个函数重写了第一个函数,可以理解为第二个对象覆盖了第一个对象。函数名只是引用,doAdd变量改变了引用的地址。

var doAdd = new Function(“iNum”, “alert(iNum + 20)”);
var doAdd = new Function(“iNum”, “alert(iNum + 10)”);

可以使用 ‘函数名.length’ 返回参数的数量:

    //函数将输出1
    function show(num){
        alert(show.length);
    };

arguments

函数的一个内置属性。arguments类似一个数组,访问该函数的实参,实参的数目不一定等于形参

    function show(x,y,z){
        alert(arguments.length);    //返回 4
        alert(arguments[2]);        //返回 c
        alert(show.length);         //返回 3
        arguments[0] = 'f';
        alert(x);                   //返回 f
    };

    show('a','b','c','d');

arguments.callee

返回此arguments对象所在的当前函数引用
比如,递归算法时函数本身,arguments.callee表示函数本身

    //计算num的阶乘
        function sum(num){
            if(num<=1) {
                return 1;
            }else{
                return num*arguments.callee(num-1);
            }
        }   

        alert(sum(4));

函数的toString() 和 ValueOf()返回函数的源代码

call apply

改变函数的作用域
二者的异同:
apply() : 接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。
call() : 第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。

<script>
    var name = "tom";

    function show(){
        alert("hello "+this.name);  //this必须加上,否则会成为全局变量
    }

    var obj = {
        name:"jerry"
    }

    show.call(window);
    show.call(obj);

</script>

结果: hello tom —> hello Jerry

this

JavaScript中的this与c++中的不同,this可以改变,对于函数fun(),如果用obj.fun()调用他,那么函数fun中得this就是obj对象,但是call(),apply()可以改变函数中的this。例如:

fun.call(window);
fun.call(this); // 此时的this就是window
这时fun函数中的this变成了了window

作用域

函数A体内包含其他函数B,只有在函数A的作用域内才能调用B

    <script>
        function A(){
            B();
            function B(){
                alert("This is function B");
            }
        }
        A();
    </script>

没有块级作用域

if(){} 没有封闭作用域的功能

    if(true){
        var temp = "sss";
    }
    alert(temp);
//结果是sss

for(;;){} i和内部的变量都是全局的

    for(var i=0;i<10;i++){
        var temps = "for";
    }
    alert("i:"+i+"temps:"+temps);
//结果是i:10 temps:for

在函数中变量加上var是局部变量,不加var就是全局变量。函数使用变量时,先从本地的作用域中搜索,如果没有搜索到就到上一层作用域中搜素。所以,访问局部变量要比全局变量快

PS:

1,基本类型不能加属性(只有Object是引用)
2,基本类型保存在栈内存中,引用类型保存在堆内存中,基本类型的赋值时复制了整个内容,而引用类型的赋值只是地址的复制
3,所有函数的参数都是按值传递的,对象传的值是地址因此外部的对象也会变化
4,instanceof 类型 判断类型不能检查基本类型

相关文章
|
7天前
|
JavaScript 前端开发 开发者
JavaScript的变量提升是一种编译阶段的行为,它将`var`声明的变量和函数声明移至作用域顶部。
【6月更文挑战第27天】JavaScript的变量提升是一种编译阶段的行为,它将`var`声明的变量和函数声明移至作用域顶部。变量默认值为`undefined`,函数则整体提升。`let`和`const`不在提升范围内,存在暂时性死区。现代实践推荐明确声明位置以减少误解。
15 2
|
3天前
|
JavaScript
js export 对外输出常量、变量和函数
js export 对外输出常量、变量和函数
11 5
|
2天前
|
JavaScript
js函数封装 —— 金额添加千分位分隔符
js函数封装 —— 金额添加千分位分隔符
9 2
|
2天前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
7 1
|
7天前
|
JavaScript 前端开发
JavaScript作用域关乎变量和函数的可见范围。
【6月更文挑战第27天】JavaScript作用域关乎变量和函数的可见范围。全局作用域适用于整个脚本,局部作用域限于函数内部,而ES6引入的`let`和`const`实现了块级作用域。全局变量易引发冲突和内存占用,局部作用域在函数执行后消失,块级作用域提高了变量管理的灵活性。作用域关键在于组织代码和管理变量生命周期。
17 1
|
1天前
|
JavaScript
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
js 数组移除指定元素【函数封装】(含对象数组移除指定元素)
2 0
|
1天前
|
JavaScript
js 调试 —— 断点(含进入函数、条件断点等)
js 调试 —— 断点(含进入函数、条件断点等)
7 0
|
1天前
|
JavaScript
JS 【详解】作用域
JS 【详解】作用域
5 0
|
1天前
|
JavaScript
JS【详解】函数.bind()
JS【详解】函数.bind()
3 0
|
1天前
|
JavaScript
js 【详解】函数中的 this 指向
js 【详解】函数中的 this 指向
3 0