>  기사  >  웹 프론트엔드  >  자바스크립트의 인수

자바스크립트의 인수

高洛峰
高洛峰원래의
2016-12-14 09:28:58998검색

function aaa(sTemplate) {  
var args = arguments;  
var s = sTemplate;
  s = s.replace(/\%\%/g, "%");
  for (var i = 1; i < args.length; i++)     
  s = s.replace( new RegExp("\%" + i + "\%", "g"), args[i] )
  return s;}

arguments는 배열이 아니지만 배열로 사용할 수 있습니다. 아래 첨자는 0부터 시작하므로

arguments[0]는 수신된 첫 번째 매개변수를 나타냅니다.

인수 [1] 받은 두 번째 매개변수를 나타냅니다.

...

등...

이런 식으로 동일한 함수를 다른 매개변수로 호출할 수 있습니다~

물론, 함수가 매개변수에 대한 처리 방법을 설정한다는 전제가 있습니다. 그렇지 않으면 쓸모가 없습니다.

인수 속성

은 현재 실행되는 함수 개체에 대한 인수 개체입니다.

function.arguments

함수 매개변수는 현재 실행 중인 함수의 이름으로 생략 가능합니다.

인수 개체의 길이 속성에는 함수에 전달된 인수의 개수가 포함됩니다. 인수 객체에 포함된 단일 매개변수에 대한 액세스 방법은 배열에 포함된 매개변수에 대한 액세스 방법과 동일합니다.

에서는 인수 속성의 사용법을 설명하기 위해 예제를 발췌했습니다. 다음을 참조할 수 있습니다.

function ArgTest(){
   var i, s, numargs = arguments.length;
   s = numargs; 
   if (numargs < 2){
      s += " argument was passed to ArgTest. It was ";
   }else{
      s += " arguments were passed to ArgTest. They were " ;
   }
   for (i = 0; i < numargs; i++){
         s += arguments[i] + " ";
   }
   return(s);
}

인용문:

1. 인수를 능숙하게 사용하세요

Javascript Array에는 인수라는 함수가 있습니다. -같은 물체. 너무 이상하고 알려지지 않은 것처럼 보이지만 수많은 Javascript 라이브러리가 강력한 기능을 사용합니다. 따라서 해당 기능을 사용하려면 모든 Javascript 프로그래머가 이에 익숙해져야 합니다.

각 함수에는 현재 호출의 매개변수를 배열과 같은 형식으로 저장하는 인수라는 변수가 있습니다. 그리고 실제로는 배열이 아닙니다. typeof 인수 문을 사용하려고 하면 "객체"(객체)가 반환되므로 Array처럼 push 및 pop과 같은 메서드를 사용할 수 없습니다. 그럼에도 불구하고 해당 값은 아래 첨자와 길이 속성을 사용하여 얻을 수 있습니다.

2. 유연한 함수 작성

알 수 없는 것처럼 보이지만 인수는 실제로 매우 유용한 객체입니다. 예를 들어 함수가 가변 개수의 인수를 처리하도록 할 수 있습니다. Dean Edwards가 작성한 base2 라이브러리에는 이 기능을 최대한 활용하는 format이라는 함수가 있습니다.

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};

바꾸기 함수의 두 번째 매개변수는 함수일 수 있습니다. 함수의 첫 번째 매개변수는 일치하는 텍스트, 두 번째 매개변수는 일치하는 값, 반환값은 대체할 텍스트입니다.

이 함수는 템플릿 대체를 구현합니다. %1 ~ %9, 나머지 매개변수가 이 위치를 순서대로 대체합니다. 예:

format("그리고 %1은(는) 누구의 %2인지 알고 싶어합니다. %3", "papers", "shirt", "wear");

위 스크립트는 복귀

"그리고 신문은 당신이 누구 셔츠를 입었는지 알고 싶어합니다" .

여기서 주목해야 할 점은 형식 함수 정의에서도 string이라는 매개변수만 정의한다는 점입니다. Javascript를 사용하면 함수 자체에서 정의한 매개변수 수에 관계없이 원하는 수의 매개변수를 함수에 전달할 수 있으며 이러한 매개변수 값을 호출된 함수의 인수 개체에 저장할 수 있습니다.

3. 실제 배열로 변환

인수 객체는 실제 자바스크립트 배열은 아니지만 배열의 슬라이스 메소드를 사용하여 배열로 변환할 수 있습니다. . 다음과 유사한 코드

var args = Array.prototype.slice.call(arguments);

call(obj, 현재 함수에서 사용하는 매개변수 목록)

호출 메소드 번호 하나는 객체이고, 전달된 객체는 슬라이스 함수를 호출하게 됩니다. 인수는 배열이 아니기 때문에 슬라이스 메소드를 직접 호출할 수 없으므로 "객체 가장" 메소드만 사용할 수 있습니다.

이런 방식으로 배열 변수 args에는 인수 객체에 포함된 모든 값이 포함됩니다.

4. 매개변수가 함수를 구성하도록 합니다.

인수 객체를 사용하면 작성하는 Javascript 코드의 양을 줄일 수 있습니다. 다음은 제공한 함수 이름과 기타 여러 매개변수를 기반으로 익명 함수를 반환하는 makeFunc라는 함수입니다. 이 익명 함수가 호출되면 원래 호출의 매개변수가 병합되어 지정된 함수에 전달되어 실행되고 반환 값이 반환됩니다.

function makeFunc() {
  var args = Array.prototype.slice.call(arguments);
  var func = args.shift();
  return function() {
    return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
  };
}

인수에는 열거할 수 없는 피호출자 속성이 있습니다(in으로 읽을 수 없으며 HasOwnProterty(이름)로 판단할 수 있음),args.callee는 실행 중인 Function 개체입니다. 현재 함수 포인터는 슬라이싱 시 복사되었으므로 args의 첫 번째 요소는 함수 유형입니다.

makeFunc의 첫 번째 매개변수는 호출할 함수의 이름을 지정합니다(예, 이 간단한 예에서는 오류 확인) 검색 후 args에서 삭제합니다. makeFunc는 함수 개체의 적용 메서드를 사용하여 지정된 함수를 호출하는 익명 함수를 반환합니다.

적용 메소드의 첫 번째 매개변수는 범위를 지정합니다. 기본적으로 범위는 호출되는 함수입니다. 하지만 이 예제에서는 조금 복잡해 보이므로 null로 설정했습니다. 두 번째 매개변수는 호출하는 함수의 매개변수를 지정하는 배열입니다. makeFunc는 자체 인수를 변환하고 호출된 함수에 전달하기 전에 익명 함수의 인수를 연결합니다.

有种情况就是总是要有个输出的模板是相同的,为了节省每次是使用上面提到的 format 函数并指定重复的参数,我们可以使用 makeFunc 这个工具。它将返回一个匿名函数,并自动生成已经指定模板后的内容:

var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");

你可以像这样重复指定 majorTom 函数:

majorTom("stepping through the door");

majorTom("floating in a most peculiar way");

那么当每次调用 majorTom 函数时,它都会使用第一个指定的参数填写已经指定的模板。例如上述的代码返回:

"This is Major Tom to ground control. I'm stepping through the door."

"This is Major Tom to ground control. I'm floating in a most peculiar way."

 

五、自引用的函数

    您可能会认为这很酷,先别急着高兴,后面还有个更大的惊喜。它(arguments)还有个其他非常有用的属性:callee 。arguments.callee 包含了当前调用函数的被引用对象。那么我们如何使用这玩意做些的事情?arguments.callee 是个非常有用的调用自身的匿名函数。

下面有个名为 repeat 的函数,它的参数需要个函数引用和两个数字。第一个数字表示运行的次数,而第二个函数定义运行的间隔时间(毫秒为单位)。下面是相关的代码:

function repeat(fn, times, delay) {
  return function() {
    if(times-- > 0) {
      fn.apply(null, arguments);
      var args = Array.prototype.slice.call(arguments);
      var self = arguments.callee;
      setTimeout(function(){self.apply(null,args)}, delay);
    }
  };
}

repeat 函数使用 arguments.callee 获得当前引用,保存到 self 变量后,返回个匿名函数重新运行原本被调用的函数。最后使用 setTimeout 以及配合个匿名函数实现延迟执行。

作为个简单的说明,比如会在通常的脚本中,编写下面的提供个字符串并弹出个警告框的简单函数:

function comms(s) {
  alert(s);
}

好了,后来我改变了我的想法。我想编写个“特殊版本”的函数,它会重复三次运行每次间隔两秒。那么使用我的 repeat 函数,就可以像这样做到:

var somethingWrong = repeat(comms, 3, 2000);

somethingWrong("Can you hear me, major tom?");

结果就犹如预期的那样,弹出了三次警告框每次延时两秒。

 

最后,arguments 即便不会经常被用到,甚至显得有些诡异,但是它上述的那些惊艳的功能(不仅仅是这些!)值得你去了解它。

 

undefined ≠ null

null是一个对象,undefined是一个属性、方法或变量。存在null是因为对象被定义。如果对象没有被定义,而测试它是否是null,但因为没有被定义,它无法测试到,而且会抛出错误。

if(myObject !== null  && typeof(myObject) !== &#39;undefined&#39;) {
//如果myObject是undefined,它不能测试是否为null,而且还会抛出错误
}
if(typeof(myObject) !== &#39;undefined&#39; && myObject !== null) {
//处理myObject的代码
}


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.