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 类型 判断类型不能检查基本类型

相关文章
|
20天前
|
存储 JavaScript 前端开发
解释 JavaScript 中的作用域和作用域链的概念。
【4月更文挑战第4天】JavaScript作用域定义了变量和函数的可见范围,静态决定于编码时。每个函数作为对象拥有`scope`属性,关联运行期上下文集合。执行上下文在函数执行时创建,定义执行环境,每次调用函数都会生成独特上下文。作用域链是按层级组织的作用域集合,自内向外查找变量。变量查找遵循从当前执行上下文到全局上下文的顺序,若找不到则抛出异常。
21 6
|
20天前
|
JavaScript
变量和函数提升(js的问题)
变量和函数提升(js的问题)
|
20天前
|
JavaScript
常见函数的4种类型(js的问题)
常见函数的4种类型(js的问题)
11 0
|
21天前
|
JavaScript
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
写一个函数将N组<>(包含开始和结束),进行组合,并输出组合结果 (js)
9 0
|
1月前
|
自然语言处理 JavaScript 网络架构
js开发:请解释什么是ES6的箭头函数,以及它与传统函数的区别。
ES6的箭头函数以`=&gt;`定义,简化了函数写法,具有简洁语法和词法作用域的`this`。它无`arguments`对象,不能用作构造函数,不支持`Generator`,且不改变`this`、`super`、`new.target`绑定。适用于简短表达式,常用于异步编程和高阶函数。
18 5
|
1月前
|
JavaScript 前端开发 网络架构
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
JavaScript 谈谈对箭头函数的理解及其与普通函数的区别。
17 1
|
1月前
|
前端开发 JavaScript 数据处理
在JavaScript中,什么是异步函数执行的例子
在JavaScript中,什么是异步函数执行的例子
10 0
|
1月前
|
JavaScript
JS封装节流函数
JS封装节流函数
15 0
|
1月前
|
JavaScript 前端开发
JavaScript函数科里化
JavaScript函数科里化
|
7天前
|
缓存 JavaScript 前端开发
js的入口函数,入口函数的作用
js的入口函数,入口函数的作用
12 4