精华内容
下载资源
问答
  • 全栈工程师开发手册 (作者:栾鹏) js系列教程4-函数、函数参数教程全解js中的4种函数调用模式javascript一共有4种调用模式...对于普通的函数调用来说,函数的返回值就是调用表达式的function add(x,y){ return x
    
        ad1.jpg
    

    全栈工程师开发手册 (作者:栾鹏)

    js系列教程4-函数、函数参数教程全解

    js中的4种函数调用模式

    javascript一共有4种调用模式:函数调用模式、方法调用模式、构造器调用模式和间接调用模式。

    【1】函数调用模式

    当一个函数并非一个对象的属性时,那么它就是被当做一个函数来调用的。对于普通的函数调用来说,函数的返回值就是调用表达式的值

    function add(x,y){
        return x+y;
    }
    var sum = add(3,4);
    console.log(sum)//7
    

    使用函数调用模式调用函数时,非严格模式下,this被绑定到全局对象;在严格模式下,this是undefined

    function add(x,y){
        console.log(this);//window
    }    
    add();
    
    function add(x,y){
        'use strict';
        console.log(this);//undefined
    }    
    add();//window
    

    因此,'this’可以用来判断当前是否是严格模式

    var strict = (function(){return !this;}());
    

    重写

    因为函数调用模式的函数中的this绑定到全局对象,所以会发生全局属性被重写的现象

    var a = 0;
    function fn(){
        this.a = 1;
    }
    fn();
    console.log(this,this.a,a);//window 1 1
    

    【2】方法调用模式

    当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。如果调用表达式包含一个提取属性的动作,那么它就是被当做一个方法来调用

    var o = {
        m: function(){
            console.log(1);
        }
    };
    o.m();//1
    

    方法可以使用this访问自己所属的对象,所以它能从对象中取值或对对象进行修改。this到对象的绑定发生在调用的时候。通过this可取得它们所属对象的上下文的方法称为公共方法。

    var o = {
        a: 1,
        m: function(){
            return this;
        },
        n: function(){
            this.a = 2;
        }
    };
    console.log(o.m().a);//1
    o.n();
    console.log(o.m().a);//2
    

    任何函数只要作为方法调用实际上都会传入一个隐式的实参——这个实参是一个对象,方法调用的母体就是这个对象,通常来讲,基于那个对象的方法可以执行多种操作,方法调用的语法已经很清晰地表明了函数将基于一个对象进行操作

    rect.setSize(width,height);
    setRectSize(rect,width,height);
    

    假设上面两行代码的功能完全一样,它们都作用于一个假定的对象rect。可以看出,第一行的方法调用语法非常清晰地表明这个函数执行的载体是rect对象,函数中的所有操作都将基于这个对象

    和变量不同,关键字this没有作用域的限制,嵌套的函数不会从调用它的函数中继承this。如果嵌套函数作为方法调用,其this的值指向调用它的对象。如果嵌套函数作为函数调用,其this值不是全局对象(非严格模式下)就是undefined(严格模式下)

    var o = {
        m: function(){
             function n(){
                 return this;
             }
             return n();
        }
    }
    console.log(o.m());//window
    
    
    var o = {
        m: function(){
             function n(){
                 'use strict';
                 return this;
             }
             return n();
        }
    }
    console.log(o.m());//undefined
    

    如果想访问这个外部函数的this值,需要将this的值保存在一个变量里,这个变量和内部函数都同在一个作用域内。通常使用变量self或that来保存this

    var o = {
        m: function(){
            var self = this;
            console.log(this === o);//true
             function n(){
                 console.log(this === o);//false
                 console.log(self === o);//true
                 return self;
             }
             return n();
        }
    }
    console.log(o.m() === o);//true
    

    【3】构造函数调用模式

    如果函数或者方法调用之前带有关键字new,它就构成构造函数调用

    
    function fn(){
        this.a = 1;
    };
    var obj = new fn();
    console.log(obj.a);//1
    

    如果构造函数调用在圆括号内包含一组实参列表,先计算这些实参表达式,然后传入函数内

    function fn(x){
        this.a = x;
    };
    var obj = new fn(2);
    console.log(obj.a);//2
    

    如果构造函数没有形参,javascript构造函数调用的语法是允许省略实参列表和圆括号的。凡是没有形参的构造函数调用都可以省略圆括号

    var o = new Object();
    //等价于
    var o = new Object;
    

    [注意]尽管构造函数看起来像一个方法调用,它依然会使用这个新对象作为调用上下文。也就是说,在表达式new o.m()中,调用上下文并不是o

    var o = {
        m: function(){
            return this;
        }
    }
    var obj = new o.m();
    console.log(obj,obj === o);//{} false
    console.log(obj.constructor === o.m);//true
    

    构造函数通常不使用return关键字,它们通常初始化新对象,当构造函数的函数体执行完毕时,它会显式返回。在这种情况下,构造函数调用表达式的计算结果就是这个新对象的值

    function fn(){
        this.a = 2;
    }
    var test = new fn();
    console.log(test);//{a:2}
    

    如果构造函数使用return语句但没有指定返回值,或者返回一个原始值,那么这时将忽略返回值,同时使用这个新对象作为调用结果

    function fn(){
        this.a = 2;
        return;
    }
    var test = new fn();
    console.log(test);//{a:2}
    

    如果构造函数显式地使用return语句返回一个对象,那么调用表达式的值就是这个对象

    var obj = {a:1};
    function fn(){
        this.a = 2;
        return obj;
    }
    var test = new fn();
    console.log(test);//{a:1}
    

    【4】间接调用模式

    javascript中函数也是对象,函数对象也可以包含方法。call()和apply()方法可以用来间接地调用函数

    这两个方法都允许显式指定调用所需的this值,也就是说,任何函数可以作为任何对象的方法来调用,哪怕这个函数不是那个对象的方法。两个方法都可以指定调用的实参。call()方法使用它自有的实参列表作为函数的实参,apply()方法则要求以数组的形式传入参数

    var obj = {};
    function sum(x,y){
        return x+y;
    }
    console.log(sum.call(obj,1,2));//3
    console.log(sum.apply(obj,[1,2]));//3
    
    展开全文
  • C语言函数调用

    千次阅读 多人点赞 2019-04-30 14:50:25
    C函数调用 调用格式: 函数名(实参表) 并且应该避免写出与实际参数计算次序有关的调用。 函数调用可以出现在以下两种情况中: 无返回值的函数通常作为表达式语句,即直接在函数调用的后面加一个分号; 有返回值的...

    C函数调用

    调用格式:
    函数名(实参表)
    并且应该避免写出与实际参数计算次序有关的调用。
    函数调用可以出现在以下两种情况中:

    • 无返回值的函数通常作为表达式语句,即直接在函数调用的后面加一个分号;
    • 有返回值的函数可以作为任何表达式的一部分,如算术表达式、逻辑表达式。

    每一段函数的开始前都应该有一段注释,方便其他人查看

    函数调用过程

    • 在main函数或调用函数中计算每一个实际参数的值。
    • 将实际参数作为形参的初值。在调用的过程中,如果形式参数和实际参数的类型不一样的时候,自动完成类型转换,将实际参数的类型转换成为形式参数的类型。
    • 依次执行被调函数的函数体的每个语句,直到遇到return语句或者函数体结束。
    • 如果return后面有表达式,计算表达式的值,,如果表达式的值与函数的类型不一致,完成类型转换。
    • 回到调用函数。如果有返回值,在函数调用的地方用return后面的返回值代替。
    • 继续调用函数的执行。
    展开全文
  • 再谈C语言有参函数调用时参数传递问题 分类: C/C++ 2012-04-24 16:51 1637人阅读 评论(0) 收藏 举报 C语言传递参数传递指针长春工程学院csdn俱乐部 C语言有参函数调用时参数间数据传递问题 ...

    再谈C语言有参函数调用时参数值传递问题

    分类: C/C++ 1637人阅读 评论(0)收藏举报

    C语言有参函数调用时参数间数据传递问题

    C语言中在发生有参函数调用时,实参变量与形参变量之间的数据都是单向的“值传递”方式。包括指针变量和数组名作参数的情况。

    C语言要求函数的实参要有确定的值,在函数调用时给形参分配相应的内存单元,同时将实参的“值”赋(复制)给形参,实现数据从实参到形参的传递(‘值传递’方式)。因为是复制,所以在操作副本(形参)过程中不会影响到原本(实参)内容。

    首先,作为函数实参的量包括常量、变量和表达式。其中变量又包括简单变量、数组元素、数组名、指针变量等。不同类型变量作参数实现的数据传递方式相同,效果不同。所谓方式相同即都是参数间数据单向的“值传递”,效果不同是指被调函数能否改变主调函数中变量的值。


    情况一:简单变量或数组元素作为函数参数

    数组元素本身属于简单变量,在向形参传递数据时,根据前述规则只需将变量中的“复制一份放到形参变量中去操作,此时在被调用函数中操作的对象(形参)与实参并不在同一内存单元,并且在调用结束后形参所占内存单元被释放,因此调用函数不会影响到实参变量的值。同时被调函数也不会影响到主调函数中其他变量的值。

    例:1
    #include<stdio.h>
    void main()
    {
    	int a=1,f(int a);
    	printf("%d%d",a,f(a));
    }
    f(int a)
    {
    	return(++a);
    }
    例2
    #include<stdio.h>
    void main()
    {
    	int a[3]={1,2,3},f(int a);
    	printf("%d%d",a[0],f(a[0]));
    }
    f(int a)
    {
    	return(++a);
    }
    



    情况二:指针变量数组名作为函数参数

    1.指针变量作函数参数

    指针变量作实参在调用时仍然符合前述“值传递”规则,将其“值”赋给形参,相当于复制。此时数据在实参与形参间传递仍是单向的,调用函数不会影响实参的“”(即指针变量中所存地址)。而与简单变量不同的是指针变量复制给形参的“”本身是一个地址,这个地址为形参访问其所指变量创造了可靠条件。我的理解是,实参是一个抽屉的钥匙,在传参时,实参复制了一把钥匙传给形参。而被调函数拿到钥匙副本后,进行的操作可以分为两类:1、对钥匙本身做了一些操作(对指针本身进行操作);2、通过钥匙对抽屉里的内容进行了一些操作( 对指针所指的变量进行操作);两种操作都不可能影响实参的值(即钥匙原本),却有可能改变实参所指向变量的值(即抽屉里的内容)。

    例1
    #include<stdio,h>
    void main()
    {
    	void swap(int*p1,int*p2);
    	int a,b;
    	int *pointer1,int*pointer2;
    	scanf("%d,%d",&a,&b);
    	pointer1=&a; pointer2=&b;
    	if(a<b) swap(pointer1,pointer2);
    	printf("%d,%d",a,b);
    }
    void swap(int*p1,int*p2)
    {
    	int temp;
    	temp=*p1;
    	*p1=*p2;
    	*p2=temp;
    }
    例2
    #include<stdio,h>
    void main()
    {
    	void swap(int*p1,int*p2);
    	int a,b;
    	int *pointer1,int*pointer2;
    	scanf("%d,%d",&a,&b);
    	pointer1=&a; pointer2=&b;
    	if(a<b)
    	swap(pointer1,pointer2);
    	printf("%d,%d",a,b);
    }
    void swap(int*p1,int*p2)
    {
    	int temp;
    	temp=p1;
    	p1=p2;
    	p2=temp;
    }

    2.数组名作函数参数

    数组名本身是一个特殊的指针变量,其值是数组的首地址,因此作实参时其传给形参的是内存中某指定单元的地址,调用过程中形参数组与实参数组占用同一段内存单元,因此对形参数组的操作也就是对实参数组的操作,对实参数组形参数组来说数据传递表现为“双向”的,而对实参变量形参变量而言数据的传递仍然是单向的。

    例
    #include<stdio,h>
    void main()
    {
    	int a[3]={1,2,3};
    	void f(int a[]);
    	f(a);
    	for(i=0;i<3;i++)
    	printf("%d",a[i]);
    }
    void f(int a[])
    {
    	for(i=0;i<3;i++)
    	a[i]++;
    }


    情况三:引用作为函数参数:

    首先申明引用和指针最大的不同是:应用本身不是变量,不存在自己的变量空间,引用只是一个作为变量别名的标志。

    引用必须依托于一个已实际存在的变量,正如一个人的如果连正名都没有,就无所谓小名了。正因为引用只是为了方便为同一个变量所取的小名,所以在任何地方通过引用对变量的操作和通过变量名进行操作的结果是一样的。

    综上,当引用作为函数参数时,对形参的操作既是对原变量的操作,可以改变实参的值。效果上虽然和通过指针改变实参一样,但两种机制完全不同,引用并没有另开辟其它空间,直接对“原本”进行了操作,节省了时间和空间。


    (拓)结构体数组作函数参数

    用结构体数组作函数参数包含两类情况:结构体数组元素作实参和结构体数组名作实参。两类情况仍然服从数据的单向传递原则只不过前者传给形参的是某些变量的值,后者传给形参的是结构体数组的首地址。

    1.结构体数组元素作实参

    符合结构体变量作实参规则,采取单向“值传递”方式将结构体变量所占的内存单元的内容全部顺序复制给形参(函数调用期间形参也要占用内存单元)。注意当实参的成员中包含数组时形参相应的成员接受到的是一个地址。

    2.结构体数组名实参

    同整形数组数组名作实参一样传递给形参的是内存中已指定单元的地址,调用过程中形参数组与实参数组占用同一段内存单元,因此对形参数组的操作也就是对实参数组的操作。对数组的操作表现为双向性。

    综上所述,对于有参函数调用时,实参变量与形参变量之间的数据都是单向的“值传递”方式。至于调用过程中是否会改变主调函数中变量的值,则只需根据具体算法看被调函数是否会找到主调函数中变量所在内存单元并对其原本进行操作。

    11
    0
    展开全文
  • 在使用MATLAB过程中,我们难免会遇到函数调用函数的情况,外面的主程序中的变量我们可以在工作区看到,他们的的变化我们可以清楚的知道,但是主程序中调用的一些函数的变量的我们却很难知道,此时,我们可以采取...

    @matlab中调用函数,如何知道被调用函数的其他变量的值

    在使用MATLAB过程中,我们难免会遇到函数调用函数的情况,外面的主程序中的变量我们可以在工作区看到,他们的值的变化我们可以清楚的知道,但是主程序中调用的一些函数的变量的值我们却很难知道,此时,我们可以采取如下方法:
    (1)将主程序中函数末尾的分号去掉,再次运行程序,在命令行窗口我们就可以看到函数中自变量的值;

    然而,被调用函数的程序中的一些变量、常量的值我们如何知道呢?

    (2)在被调用函数的某处直接加入一段程序即可,这段程序就是你这个想知道的变量的名字,不加分号,回到主程序,运行,即可在命令行窗口看到这个变量的变化的值。

    展开全文
  • 函数调用过程

    万次阅读 多人点赞 2018-01-31 09:21:19
    今天突然看到有人私信我说一直没写函数调用过程(栈帧的形成和销毁过程)这篇博文,赶紧补上。 刚看的栈帧内容时,我很迷惑,我觉得栈帧创建和销毁很麻烦,几句话根本说不完,而且我好像描述不清楚他的过程,所以...
  • 自定义函数及函数调用

    千次阅读 2019-05-10 12:17:10
    1、自定义函数声明、函数调用、函数实现概念混淆 2、形参和实参混淆; 3、自定义函数参数的传值方式混淆;传来传去都不知道传的到底是什么? 接下来,我就重点围绕道友们常见的问题,说一说: 1、自定义函数声明...
  • Python函数如何返回多个,如何在调用函数时分别接收返回的多,返回值为空或无返回值情况如何解决
  • 栈帧和函数调用(一)一,栈帧的介绍二,函数调用与栈的关系三,汇编演示      在计算机科学中,栈是一个特殊的容器,用户可以将数据压入栈中(入栈,push),也可以将已经压入栈中的数据...
  • C语言函数调用栈(一)

    万次阅读 多人点赞 2018-07-19 22:16:25
    编译器使用堆栈传递函数参数、保存返回地址、临时保存寄存器原有(即函数调用的上下文)以备恢复以及存储本地局部变量。 不同处理器和编译器的堆栈布局、函数调用方法都可能不同,但堆栈的基本概念是一...
  • 函数调用约定

    千次阅读 2012-11-26 21:31:00
    函数调用约定就是描述参数如何传递,堆栈由调用方还是被调用方平衡,返回值如何返回等规则。 函数调用约定的几种类型有:__stdcall, __cdecl, __fastcall, __thiscall, __nakedcall, __pascal 下面介绍几种常见的...
  • 我们一般将字符串、列表等变量作为参数进行函数调用。但函数本身也是一个对象,所以我们也可以将函数作为参数传入另外一个函数中并进行调用。 本关的目标是让读者了解并掌握函数作为参数传入另外一个函数中并进行...
  • SQL 标量值函数调用

    千次阅读 2018-11-10 09:19:35
    SQL 标量值函数调用
  • 再谈C语言有参函数调用时参数传递问题

    千次阅读 多人点赞 2012-04-24 16:51:30
    C语言要求函数的实参要有确定的,在函数调用时给形参分配相应的内存单元,同时将实参的“”赋(复制)给形参,实现数据从实参到形参的传递(‘传递’方式)。因为是复制,所以在操作副本(形参)过程中不会...
  • 内存堆栈,函数调用

    万次阅读 2018-04-17 10:43:03
    栈结构是为了 函数调用,所以有了,函数调用栈call stack, 编译器处理,释放内存,大小有默认值,固定值,非常有限 使用栈是因为栈的lifo符合函数调用顺序特性,方便处理 为什么函数调用要用栈实现 函数调用约定...
  • Java函数调用

    千次阅读 2019-09-26 19:44:23
    函数调用 举例说明Java中函数的调用 public class test { public static void main(String[] args) { int i = 0; func(i); i = i++; System.out.println(i); String str = "hello wo...
  • 函数的参数和函数调用

    千次阅读 2015-03-14 16:07:06
    在定义函数函数名后面括号中的变量称为“形参”,在主调函数(一般为Main)调用一个函数时,函数名后面括号中的参数(可以是一个表达式)称为“实参”。 例如: void func(int x,int y) { ........
  • 源码: 方法一: script> $(function(){ b(); }); function a(){ var a =1;... //一定要return出去,如果不return出去,因为参数是私有的,另外一个函数无法获取到 } function b(){ var b =
  • 调用函数,计算分段函数

    千次阅读 2018-10-31 17:00:35
    要求自定义函数sign(x)计算分段函数值,在main函数中输入x,调用函数sign(x)完成计算,输出函数结果。当x &gt; 0时,函数值为1; 当x = 0时,函数值为0;当x &lt; 0时,函数值为-1。 程序框架: int sign...
  • C++的函数声明、函数定义、函数调用

    万次阅读 多人点赞 2019-07-02 17:30:05
    如果使用自己定义的函数,这个函数调用它的函数的后面(比如在main函数后面),则必须在调用之前进行函数声明。因为程序是从上到下逐行编译的,若无函数声明,则会无法识别函数函数声明在编译时并不检查参数...
  • shell脚本中调用python脚本的函数并获取python脚本函数的return 例子1: 废话少说,直接上代码: python脚本:merge_report.py # coding=utf-8 import sys def main(param): return param def find_...
  • C语言函数调用三种方式:传值调用,引用调用和传地址调用
  • 函数调用的作用: ·用实参数向形式参数传递数据; ·为获得数据参数及在函数体中声明的变量分配存储空间; ·中断现行(调用)函数,把流程向被调用函数的入口处,开始执行被调函数。当参数表为空时,表示该函数...
  • C语言基础知识:C语言函数调用怎么返回两个

    万次阅读 多人点赞 2018-09-22 11:45:29
    在C语言中,函数只能返回一个,要返回两个,可以改换思路,通过其它方式做到。 1 建立数组,返回指针。 在要返回的两个类型相同时,可以用创建数组的方式,将要返回的存在数组中,并返回数组首地址,这样...
  • 函数调用求四个数中最大

    千次阅读 2019-04-19 16:59:51
    知识点:函数调用 思路:定义两个函数,分别用于求出四个数字和两个数字中的最大。 程序代码: #include <stdio.h> #include <windows.h> int max4(int i,int j,int k,int l) { int max; max=...
  • 在matlab里.m文件分执行文件和函数文件 在c++中执行文件指:main函数 函数文件:其他所有需要用到的函数 在c++中,函数文件名没有特殊讲究,将文件添加到工程目录便能使用 对函数的要求有三点 函数的完整文件 输入...
  • 以数组作为函数参数的函数调用

    万次阅读 2018-11-28 15:04:44
    调用有参函数时需要提供实参,实参可以是常量变量或者表达式,数组元素就相当于变量,因此数组元素可以用作函数实参,但是不能用作函数形参(因为在函数调用时临时分配存储单元,不可能为一个数组单独分配存储单元...
  • 函数调用堆栈图

    千次阅读 2015-08-18 15:38:49
    熟悉函数调用时的堆栈操作是学好汇编语言的必备知识,在此只写出了最简单的函数调用过程 , 有错误的地方,欢迎批评指正. 注:该程序通过VS2012编译. 函数调用方式为C调用方式 : A. 用栈自右向左传参 B : 调用者平衡...
  • 这种形式的数据结构正好满足我们调用函数的方式: 父函数调用子函数,父函数在前,子函数在;返回时,子函数先返回,父函数返回。栈支持两种基本操作,push和pop。push将数据压入栈中,pop将栈中的数据弹出并存储...
  • 题目是:将两个字符数组链接起来拷贝给第三个字符数组。代码如下: ![图片说明]...报错大多是函数调用在常量表达式中必须含有常量,请问是我初始化str1和str2的时候出错了么?
  • C语言中的函数调用和函数返回值

    万次阅读 2016-10-31 23:19:11
    函数调用也就是主调函数使用被调函数,函数调用的一般形式为:函数名({实际参数表}) 对无参函数调用时则无实际参数表。 实际参数表中的参数可以是常数,变量或其他构造类型数据及表达式。 各实参之间用逗号分隔...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,326,345
精华内容 930,538
关键字:

如何固定函数调用后的值