CAPL 脚本对.ini 配置文件的高阶操作

目录
  • 前言
  • 批量读取代码讲解
  • 批量写入代码讲解
  • 更新INI文件键值对
  • 删除INI文件键值对
  • 增加INI文件键值对
  • 新建INI文件

前言

前面其实我们已经掌握了对配置文件,文本文件的读写函数和方法,如果一个INI文件只有少许的键值对,那么用内置函数也还凑合,但是当INI文件中的键值对多了起来,内置函数一个一个去读写的方式就非常繁琐,本节就针对这种情况对INI文件的读写方式进行升级,以达到快速便捷读写多键值对的情况

演示软硬件环境 Win10 x64 ; CANoe 11 SP2 x64

批量读取代码讲解

1️⃣ 本节演示仍然基于 bmw2.cfg ,新增一个Nework Node ,用于按键触发测试

2️⃣ 下图的test.ini 文件是我们的测试文件,键值对有很多

3️⃣ 我们按照编程习惯,控制语句放在IniAuto.can文件中,函数和全局变量放在IniAuto.cin文件中IniAuto.can中代码:

/*@!Encoding:936*/
includes
{
  #include "IniAuto.cin"
}

on key 'u'
{
  write("*****press u***********");
  getKeyValueFromINI(Ini_data_path,var_Ini_Data);
  if(1) //debug check values
  {
    int i ;
    write ("************************Debug data******************************");
    for(i = 0 ;i < var_Ini_Data.items ;i++)
    {
      write ("*******section:%s*******",var_Ini_Data.section[i]);
      write ("*******index:%d***keys:%s*******",i,var_Ini_Data.keys[i]);
      write ("*******index:%d***values:%s*******",i,var_Ini_Data.values[i]);
    }
  }
}

4️⃣ 头文件 IniAuto.cin中代码:

/*@!Encoding:936*/

variables
{
    char Ini_data_path[100] = ".//TestModule//IniAutoCode//test.ini";
    char Ini_data_path_out[100] = ".//TestModule//IniAutoCode//test_out.ini";
    const int max_items = 200 ;
    const int max_keys_size = 50 ;
    const int max_values_size = 300 ;

    struct Ini_Data // record Ini data
  {
    int  items;
    char section[max_items][max_keys_size];
    char keys   [max_items][max_keys_size];
    char values [max_items][max_values_size];

  };
   struct Ini_Data var_Ini_Data;
}

/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
批量读INI
----------------------------------------------------------------------------------------------------
***************************************************************************************************/
int getKeyValueFromINI(char FilePath[], struct Ini_Data Temp_var_Ini_Data)
{
  int i,j,glbHandle;
  char buffer[max_values_size];
  long section_find, key_find;
  char section_temp[max_keys_size];
  char keys_temp_1[max_keys_size]    ,keys_temp_2[max_keys_size];
  char values_temp_1[max_values_size],values_temp_2[max_values_size];

  glbHandle = OpenFileRead (FilePath,0);

  if (glbHandle!=0 )
  {
    write("Open file :%s passed.",FilePath);
    j = 0;

    while(fileGetStringSZ(buffer,elcount(buffer),glbHandle)!=0)
    {
      section_find = strstr_regex(buffer, "\\[.*?\\]"); //用正则表达式匹配 []
      if(section_find != -1)
       {
        ClearCharArray(section_temp);
        substr_cpy (section_temp,buffer,1,strlen(buffer)-2,  elcount(buffer));//掐头去尾,去掉[]
        continue ;
       }

      key_find = strstr(buffer, "=");     

      if(key_find != -1)
      {
        ClearCharArray(keys_temp_1);ClearCharArray(keys_temp_2); //临时字符串使用之前要初始化
        substr_cpy (keys_temp_1,buffer,0,key_find,  elcount(buffer));// = 前的key
        remove_space(keys_temp_1,keys_temp_2);                 //清除字符传中的空格

        ClearCharArray(values_temp_1);ClearCharArray(values_temp_2);
        substr_cpy (values_temp_1,buffer,key_find+1,strlen(buffer) - key_find, elcount(buffer));//= 后的value
        remove_space(values_temp_1,values_temp_2);

        strncpy (Temp_var_Ini_Data.section[j],section_temp  ,elcount(Temp_var_Ini_Data.section[j]));
        strncpy (Temp_var_Ini_Data.keys[j]   ,keys_temp_2   ,elcount(Temp_var_Ini_Data.keys[j]));
        strncpy (Temp_var_Ini_Data.values[j] ,values_temp_2 ,elcount(Temp_var_Ini_Data.values[j]));
        j++;  // index ++
      }
    }
    Temp_var_Ini_Data.items = j ;  // 最后统计多少行数据
    fileClose (glbHandle);
  }
  else
  {
    write("Read file :%s failed.",FilePath);
    return 0; //failed
  }
  return 1; //passed
}

/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
去除字符串的空格
----------------------------------------------------------------------------------------------------
***************************************************************************************************/
void remove_space(char input_c[],char out_c[])
{

  int i,j ;
  j=0;

  for(i = 0; i< strlen(input_c);i++)
  {
    if (input_c[i] != ' ')
    {
      out_c[j] = input_c[i];
      j++;
    }
  }
}
/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
字符串初始化
----------------------------------------------------------------------------------------------------
***************************************************************************************************/
void ClearCharArray(char arrIn[])
{
	int i, length;
  length = strlen(arrIn);
  for(i=length;i>=0;i--){
   arrIn[i]=0x00;
  }
}

5️⃣ 头文件 IniAuto.cin中不良定义解释
说明:因为涉及到批量操作,所有都化整为零,全部key/value的数据类型都视为字符串操作,实际代码中,如果有整形浮点型的,请再进行格式转换

6️⃣ 头文件 IniAuto.cingetKeyValueFromINI 函数的注释

7️⃣ 按键’u‘,看下测试结果:

我们已经把ini的键值对都转换为了CAPl的数组类型,那么这样我们在下一步无论怎么去批量读,改写,删除

批量写入代码讲解

  • 1️⃣ 我们读取了之后,可能的操作是改写,删除,添加,甚至是新建操作,那么这一系列操作之后,我们还要保存到原来的INI文件的。
  • 2️⃣ 我们按照编程习惯,控制语句放在IniAuto.can文件中,函数和全局变量放在IniAuto.cin文件中

IniAuto.can中的增加的代码:

/*@!Encoding:936*/
on key 'm'
{
  write("*****press m***********");

  SetKeyValueToINI(Ini_data_path_out,var_Ini_Data);
}

3️⃣ 头文件 IniAuto.cin中增加的代码:

/*@!Encoding:936*/

/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
批量写入Key/value 到INI
----------------------------------------------------------------------------------------------------
***************************************************************************************************/
int SetKeyValueToINI(char FilePath[], struct Ini_Data Temp_var_Ini_Data)
{
  long retVal;
  int i,j,glbHandle;
  char buffer[max_values_size];
  char section_temp[max_items][max_keys_size];
  char tempText[max_values_size];

  ClearCharArray(section_temp);
  glbHandle = OpenFileWrite(FilePath,0); // 写入文件,以覆盖源文件的形式

  if (glbHandle!=0 )
  {
    write("Open file :%s passed.",FilePath);
    j = 0 ;
    for(i=0;i< Temp_var_Ini_Data.items ; i++)
    {

      if((strncmp(Temp_var_Ini_Data.section[i],"",strlen(Temp_var_Ini_Data.section[i])) !=0)&&
         (strncmp(Temp_var_Ini_Data.keys[i],   "",strlen(Temp_var_Ini_Data.keys[i]))    !=0)) //section、key 值不为空,写入

      {
        /* section_temp是一个临时字符串数组,用来存储已经写过的section,
        每次执行写入前会先检查下是否已经写过了,如果没写过,就添加到这个素组中,如果在这个数组中找到了,就不再写入Ini了
        */
        retVal = SeachValueInArrary(Temp_var_Ini_Data.section[i],section_temp );

        if (retVal== -1)
        {
          snprintf(tempText, elcount(tempText), "\n[%s]\n", Temp_var_Ini_Data.section[i]);
          filePutString (tempText, elcount(tempText),glbHandle);
          strncpy (section_temp[j],Temp_var_Ini_Data.section[i]  ,elcount(section_temp[j]));
          j++ ;
        }

        snprintf(tempText, elcount(tempText), "%s = %s\n", Temp_var_Ini_Data.keys[i],Temp_var_Ini_Data.values[i]); //写入键值对
        filePutString (tempText, elcount(tempText),glbHandle);
      }
    }      

    fileClose (glbHandle);
  }
  else
  {
    write("Write file :%s failed.",FilePath);
    return 0; //failed
  }
  return 1; //passed
}

/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
在一个中查找指定值
----------------------------------------------------------------------------------------------------
***************************************************************************************************/
long SeachValueInArrary(char target[] ,char source[][])
{

  int i ;

  for(i= 0;i<elcount(source);i++)
  {
    if(strncmp(target,source[i],strlen(target)) ==0 )
    {
      //write("Seached value %s in the arrary and the index is %d",target,i);
      return i;
    }
  }
  return -1 ;
}

4️⃣ 我们再在按键’u‘,读取了INI文件后,什么操都不要做,然会按下’m‘,看下测试结果已经都写进来了

更新INI文件键值对

  • 1️⃣ 我们读取了之后,可能的操作是改写其中的某个键值对,
  • 2️⃣ 我们按照编程习惯,控制语句放在IniAuto.can文件中,函数和全局变量放在IniAuto.cin文件中

IniAuto.can中的增加的代码:

on key 'i' //改写key
{

  write("*****press %c***********",this);
  updateINIvalue(0,"Tester ","Runer","",var_Ini_Data,Ini_data_path_out); // 改写第一个键值对的key,索引值是0,把Tester改成Runer

}

on key 'p' //改写value
{

  write("*****press %c***********",this);
  updateINIvalue(0,"Tester","Tester","https://blog.csdn.net/qq_34414530",var_Ini_Data,Ini_data_path_out); // 改写第一个键值对的value,索引值是0,

}

on key 'k' //改写value
{

  write("*****press %c***********",this);
  updateINIvalue(0,"Tester","Runer","https://blog.csdn.net/qq_34414530",var_Ini_Data,Ini_data_path_out); // 对key和value同时操做

}

3️⃣ 头文件 IniAuto.cin中增加的代码:

/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
更改键值对,不完善,异常捕捉代码需完善
----------------------------------------------------------------------------------------------------
***************************************************************************************************/

void updateINIvalue(long index ,char section[],char keys[],char values[],struct Ini_Data Temp_var_Ini_Data,char FilePath[])
{
  if(index < Temp_var_Ini_Data.items)
  {
    if(strncmp(section,"",strlen(section)) !=0)// 不等于空,就写入
    {
      strncpy (Temp_var_Ini_Data.section[index],section  ,elcount(Temp_var_Ini_Data.section[index]));
    }
    if(strncmp(keys,"",strlen(keys)) !=0)// 不等于空,就写入
    {
      strncpy (Temp_var_Ini_Data.keys[index]   ,keys     ,elcount(Temp_var_Ini_Data.keys[index]));
    }
    if(strncmp(values,"",strlen(values)) !=0)// 不等于空,就写入
    {
      strncpy (Temp_var_Ini_Data.values[index] ,values   ,elcount(Temp_var_Ini_Data.values[index]));
    }

     SetKeyValueToINI(FilePath, Temp_var_Ini_Data); //保存
  }
  else
  {
    write("index out of range.");
  }
}

4️⃣ 我们看下测试结果

先按键’u‘读取原始INI,然会按下’i‘,改写Key值:

先按键’u‘读取原始INI,然会按下p,改写value值:

先按键’u‘读取原始INI,然会按下k,改写key/value值:

删除INI文件键值对

  • 1️⃣ 我们读取了之后,可能的操作是改写其中的删除某个键值对,
  • 2️⃣ 我们按照编程习惯,控制语句放在IniAuto.can文件中,函数和全局变量放在IniAuto.cin文件中

IniAuto.can中的增加的代码:

on key 'h' //删除键值对
{

  write("*****press %c***********",this);
  deleteINIItem(3,var_Ini_Data,Ini_data_path_out); // 删除Peed = 20.5
}

3️⃣ 头文件 IniAuto.cin中增加的代码:

/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
删除键值对,这里根据索引去删除,也可以再重载函数根据key值或者value值去删除
当然也可以重载函数,传入索引数组,去批量删除,
后期有时间再继续完善
----------------------------------------------------------------------------------------------------
***************************************************************************************************/

void deleteINIItem(long index ,struct Ini_Data Temp_var_Ini_Data,char FilePath[])
{
  if(index < Temp_var_Ini_Data.items)
  {
    strncpy (Temp_var_Ini_Data.section[index],""  ,elcount(Temp_var_Ini_Data.section[index]));
    strncpy (Temp_var_Ini_Data.keys[index]   ,""  ,elcount(Temp_var_Ini_Data.keys[index]));
    strncpy (Temp_var_Ini_Data.values[index] ,""  ,elcount(Temp_var_Ini_Data.values[index]));

    SetKeyValueToINI(FilePath, Temp_var_Ini_Data); //保存
  }
  else
  {
    write("index out of range.");
  }
}

4️⃣ 我们看下测试结果

先按键’u‘读取原始INI,然会按下’h‘,删除Peed = 20.5:

增加INI文件键值对

  • 1️⃣ 我们读取了之后,可能的操作是增加某个键值对
  • 2️⃣ 我们按照编程习惯,控制语句放在IniAuto.can文件中,函数和全局变量放在IniAuto.cin文件中

IniAuto.can中的增加的代码:

on key 'j' //增加键值对
{

  write("*****press %c***********",this);
  appendINIItem("Number","place","shanghai",var_Ini_Data,Ini_data_path_out); // 在[Number] 下增加一个place = shanghai,
}

on key 'g' //增加键值对,新的section
{
  write("*****press %c***********",this);
  appendINIItem("Position","place","shanghai",var_Ini_Data,Ini_data_path_out); // 在[Number] 下增加一个place = shanghai,
}

3️⃣ 头文件 IniAuto.cin中增加的代码:

/***************************************************************************************************
----------------------------------------------------------------------------------------------------
Revision history:
Date   2022-2-18
Author mayixiaobing
增加键值对,下面的代码支持加入新的section,如果要在已有的section
----------------------------------------------------------------------------------------------------
***************************************************************************************************/

void appendINIItem(char section[],char keys[],char values[],struct Ini_Data Temp_var_Ini_Data,char FilePath[])
{
  long retIndex ;
  long items;
  long i ;

  if((strncmp(section,"",strlen(section)) !=0)&&
     (strncmp(keys   ,"",strlen(keys))    !=0)) //section、key 值不为空,写入
  {

    items = Temp_var_Ini_Data.items ;  

    retIndex = SeachValueInArrary(section,Temp_var_Ini_Data.section);    

    if (retIndex == -1)//如果是新的section,直接尾处追加
    {
      strncpy (Temp_var_Ini_Data.section[items],section  ,elcount(Temp_var_Ini_Data.section[items]));
      strncpy (Temp_var_Ini_Data.keys[items]   ,keys     ,elcount(Temp_var_Ini_Data.keys[items]));
      strncpy (Temp_var_Ini_Data.values[items] ,values   ,elcount(Temp_var_Ini_Data.values[items]));  

    }
    else //如果是已有section,从索引处,向后顺移
    {
      for(i= items;i > retIndex ;i--)
      {
        strncpy (Temp_var_Ini_Data.section[i],Temp_var_Ini_Data.section[i-1]  ,elcount(Temp_var_Ini_Data.section[i]));
        strncpy (Temp_var_Ini_Data.keys[i]   ,Temp_var_Ini_Data.keys[i-1]     ,elcount(Temp_var_Ini_Data.keys[i]));
        strncpy (Temp_var_Ini_Data.values[i] ,Temp_var_Ini_Data.values[i-1]   ,elcount(Temp_var_Ini_Data.values[i]));
      }
      strncpy (Temp_var_Ini_Data.section[retIndex],section  ,elcount(Temp_var_Ini_Data.section[retIndex]));
      strncpy (Temp_var_Ini_Data.keys[retIndex]   ,keys     ,elcount(Temp_var_Ini_Data.keys[retIndex]));
      strncpy (Temp_var_Ini_Data.values[retIndex] ,values   ,elcount(Temp_var_Ini_Data.values[retIndex]));
    }

    Temp_var_Ini_Data.items = items + 1;
    SetKeyValueToINI(FilePath, Temp_var_Ini_Data); //保存
  }
}

4️⃣ 我们看下测试结果

先按键’u‘读取原始INI,然会按下’j‘,在已有的section新加一个key/value:

先按键’u‘读取原始INI,然会按下’g‘,新建section以及key/value:

新建INI文件

1️⃣ 我们也可以直接新建一个键值对文件,不需要提前读取

2️⃣ 我们按照编程习惯,控制语句放在IniAuto.can文件中,函数和全局变量放在IniAuto.cin文件中

IniAuto.can中的增加的代码,下面是新增两个参数:

on key 'f' //新建ini文件
{

  write("*****press %c***********",this);
  var_Ini_Data.items = 2;
  strncpy (var_Ini_Data.section[0],"test"  ,elcount(var_Ini_Data.section[0]));
  strncpy (var_Ini_Data.keys[0]   ,"para1" ,elcount(var_Ini_Data.keys[0]));
  strncpy (var_Ini_Data.values[0] ,"1234"  ,elcount(var_Ini_Data.values[0]));

  strncpy (var_Ini_Data.section[1],"test"  ,elcount(var_Ini_Data.section[0]));
  strncpy (var_Ini_Data.keys[1]   ,"para2" ,elcount(var_Ini_Data.keys[0]));
  strncpy (var_Ini_Data.values[1] ,"4567"  ,elcount(var_Ini_Data.values[0]));

  SetKeyValueToINI(Ini_data_path_out,var_Ini_Data);
}

3️⃣ 头文件IniAuto.cin中增加的代码:

无新增.cin代码

4️⃣ 我们看下测试结果

到此这篇关于CAPL 脚本对.ini 配置文件的高阶操作的文章就介绍到这了,更多相关CAPL 脚本.ini 配置文件操作内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# Ini文件操作实例

    在开源中国看到的操作ini文件的,写的还不看,留着以后用 复制代码 代码如下: using System;using System.IO;using System.Runtime.InteropServices;using System.Text;using System.Collections;using System.Collections.Specialized; namespace wuyisky{ /**//**/ /**//// <summary> /// IniFiles的类 /

  • C/C++ INI文件操作实现代码

    一.INI文件用途: 1.存储程序的初始化信息: 2.存储需要保存的数据信息. 二.INI文件结构: 由节名.键名.键值组成.形式如下: [节名] 键名 = 键值 备注:一个INI文件,可以用多个节. 三.读取INI文件 1.WritePrivateProfileString 该函数用于向INI文件中写入一个字符串数据. 函数原型如下: BOOL WritePrivateProfileString( LPCTSTR lpAppName, // pointer to section name LP

  • CAPL 脚本对.ini 配置文件的高阶操作

    目录 前言 批量读取代码讲解 批量写入代码讲解 更新INI文件键值对 删除INI文件键值对 增加INI文件键值对 新建INI文件 前言 前面其实我们已经掌握了对配置文件,文本文件的读写函数和方法,如果一个INI文件只有少许的键值对,那么用内置函数也还凑合,但是当INI文件中的键值对多了起来,内置函数一个一个去读写的方式就非常繁琐,本节就针对这种情况对INI文件的读写方式进行升级,以达到快速便捷读写多键值对的情况 演示软硬件环境 Win10 x64 : CANoe 11 SP2 x64 批量读取代

  • TensorFlow人工智能学习张量及高阶操作示例详解

    目录 一.张量裁剪 1.tf.maximum/minimum/clip_by_value() 2.tf.clip_by_norm() 二.张量排序 1.tf.sort/argsort() 2.tf.math.topk() 三.TensorFlow高阶操作 1.tf.where() 2.tf.scatter_nd() 3.tf.meshgrid() 一.张量裁剪 1.tf.maximum/minimum/clip_by_value() 该方法按数值裁剪,传入tensor和阈值,maximum是把数

  • GO语言ini配置文件的读取的操作

    iniconf 博主前两天在写一个小的go语言项目,想找一个读取ini格式配置和的三方库,在网上找了一圈感觉都不是很好用, 使用起来非常的奇怪,于是自己写了一版,还有两个接口没有实现,在项目中修改或删除配置项后更新到文件中,等待后续有时间了再写,希望用的朋友感觉不错点个赞 github 地址 描述 使用iniconf更简单的读取go的ini配置文件以及根据特定格式的各种配置文件. 安装方法 go get github.com/clod-moon/goconf 使用方法 ini配置文件格式样列 [

  • Shell脚本读取ini配置文件的实现代码2例

    一.简单版 参考stackoverflow的例子,改了一个出来: 复制代码 代码如下: while IFS='= ' read var val do     if [[ $var == \[*] ]]     then         section=$(echo $var | sed 's/^\[\(.*\)\]$/\1/')     elif [[ $val ]]     then         if [ -z $section ];then             declare "${

  • 详解PyTorch中Tensor的高阶操作

    条件选取:torch.where(condition, x, y) → Tensor 返回从 x 或 y 中选择元素的张量,取决于 condition 操作定义: 举个例子: >>> import torch >>> c = randn(2, 3) >>> c tensor([[ 0.0309, -1.5993, 0.1986], [-0.0699, -2.7813, -1.1828]]) >>> a = torch.ones(2,

  • 使用python脚本自动创建pip.ini配置文件代码实例

    这篇文章主要介绍了使用python脚本自动创建pip.ini配置文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 运行一下python代码自动创建pip/pip.ini文件并添加pip源 """ python建立pip.ini.py 2016年4月30日 03:35:11 codegay """ import os ini="""[global] inde

  • Python测试框架pytest高阶用法全面详解

    目录 前言 1.pytest安装 1.1安装 1.2验证安装 1.3pytest文档 1.4 Pytest运行方式 1.5 Pytest Exit Code 含义清单 1.6 如何获取帮助信息 1.7 控制测试用例执行 1.8 多进程运行cases 1.9 重试运行cases 1.10 显示print内容 2.Pytest的setup和teardown函数 函数级别setup()/teardown() 类级别 3.Pytest配置文件 4 Pytest常用插件 4.1 前置条件: 4.2 Pyt

  • 详谈Python高阶函数与函数装饰器(推荐)

    一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"翻译"所以格式编码的格式.Python3中

  • Mysql my.ini 配置文件详解

    Mysql my.ini 配置文件详解 #BEGIN CONFIG INFO #DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大 #TYPE: SYSTEM #END CONFIG INFO # # 此mysql配置文件例子针对4G内存 # 主要使用INNODB #处理复杂队列并且连接数量较少的mysql服务器 # # 将此文件复制到/etc/my.cnf 作为全局设置, # mysql-data-dir/my.cnf 作为服务器指定设置 # (@loc

  • Javascript 高阶函数使用介绍

    高阶函数(higher-order function)-如果一个函数接收的参数为或返回的值为函数,那么我们可以将这个函数称为高阶函数.众所周知,JavaScript是一种弱类型的语言:JavaScript的函数既不对输入的参数,也不对函数的输出值作强定义和类型检查,那么函数可以成为参数,也可以成为输出值,这就体现了JavaScript对高阶函数的原生支持. 一.参数为函数的高阶函数: function funcTest(f){ //简易判断一下实参是否为函数 if((typeof f)=="fu

随机推荐