2010-04-26 6 views
1

함수를 변수로 전달할 수 있는지 궁금했습니다. 예를 들어 : 나는 이런 식으로 뭔가 할 싶은 기능을JQuery Javascript - 함수를 변수로 전달

$('#validate').makeFloat({x:671,y:70,limitY:700}); 

있습니다

$('#validate').makeFloat({x:function(){ return $("#tabs").offset().left+$("#tabs").width();},y:70,limitY:700}); 

이 작동하지 않습니다,하지만 이상적 변수에 액세스 할 때마다 그것은 새 값을 계산하는 것 . 따라서 창 크기를 조정하면 정적으로 전달 된 변수와 달리 자동으로 조정됩니다. 나는 이것을 함수 \ widget 내부에서 직접 구현할 수 있다는 것을 알았지 만 위와 같은 것을 할 수있는 방법이 있는지 궁금합니다.

이 개념은 플러그인과 관련이 없습니다. 나는 변수가 "캐스트"된 함수에 대해 이야기하고 있습니다.

+0

makeFloat()가 지원하지 않으면 작동하지 않습니다. –

답변

2

예, 속성을 읽을 때 일부 함수를 호출하는 객체를 전달할 수 있지만 (getter라고 함) 크로스 브라우저 호환이 아닙니다. 파이어 폭스에 대한 __defineGetter__와 같은 다른 브라우저에 대한 다른 구문이 있습니다

var o = {y:70, limitY:700}; 
Object.defineProperty(o, 'x', {get: function() {return 671;}}); 
$('#validate').makeFloat(o); 

, 일부 브라우저에서 모든 기능이없는 예를 들어,이 (아마도) IE9에서 작동합니다. 따라서 코드가 실행되는 환경을 완전히 제어 할 수 없다면 실제로는 쓸모가 없습니다.

+0

빙고. 이것이 내가 원했던 것이다. 그것은 비록 표준화되지 않습니다 빨아 : ( 고맙습니다, 조쉬. –

+0

와우, 그런 기능이 있는지 몰랐어요. 내가 좀 봤 거든 Webkit/Presto/Gecko이 잠시 동안 구현하고 그들의 구현을 발견 ECMAScript 3.1/4에서 표준화 된 것으로 보인다. http://annevankesteren.nl/2009/01/gettters-setters – jholster

0

"작동하지 않는다"는 것을 어떻게 압니까?

컴파일하고 실행해야하는 것처럼 보입니다. 그러나 어떤 일이 발생하면 함수를 실행하고 상수를 사용하거나 인라인이 아닌 함수를 호출 한 경우와 다른 값을 설정합니다.

당신이해야 할 일은 창 크기를 조정할 때 발생하는 이벤트에이 코드 줄을 넣는 것입니다.

0

makeFloat가 jQuery 플러그인에서 만든 것 같습니다. 플러그인에서 'x'가 함수가 될 수 있고 올바르게 실행한다는 것을 알고 있습니까? jQuery 사이트에서 숫자 값 또는 '현재'를 문자열이 아니라 함수로 이해할 수있는 것처럼 보입니다.

0

함수를 변수로 전달할 수는 있지만 실제로는 사용자가 요구하는 것이 아닙니다.

묻는 것처럼 보이는 것은 "표현식의 결과에 DOM 속성을 설정할 수 있습니까?"입니다. 대답은 "아니오"입니다. (참고 - IE의 CSS 표현식과 같은 브라우저 고유의 비헤비어가 아닌 IE8에서는 더 이상 사용되지 않습니다.)

이벤트 핸들러를 window.onresize에 바인드하고 함수를 사용하여 크기를 직접 업데이트해야합니다 .

1

x (obj.x 대신 obj.x())이 호출되지 않으면 작동하지 않습니다.

코드를 실행하려면 makeFloat() 코드에서 x 유형을 확인하고 함수 인 경우 호출해야합니다. 함수 위해서는

+0

'makeFloat()'가 윈도우 크기 조정을위한 바인딩을 추가하지 않으면 작동하지 않습니다. –

+2

@Peter 이차적 인 문제입니다. jweyrich는 OP의 제안이 개념적으로 작동하지 않는 이유를 지적합니다. –

+0

위치의 실제 업데이트는 Vivin이 지적한 것처럼 2 차 세부 사항이었습니다. 필자는 함수를 매개 변수로 전달하는 맥락에서 문제의 해결을 찾고있었습니다. 고맙습니다. –

0

는 변수에서 실행하기 위해서는,과 같이, 호출되어야한다 :

option이 함유 가변
$.option.callback.call(); 

, callback 함수이며 call 함수를 실행한다.

옵션이없는 것은 아닙니다. 해당 함수의 반환 값이 행 자체에서 실행되도록 설정할 수 있습니다. 또는 설명 된 대체 방법으로 설정할 수도 있습니다.

1

나는 당신이하려는 것을보고 있지만 작동하지 않습니다. 왜? makeFloat은 값이 비 함수 유형일 것으로 기대합니다. 그것은 아마도 그 값을 직접 사용합니다.실제로 함수를 실행하려면 makeFloatx() 또는 심지어 x.call(...) 또는 x.apply(...) 일 필요가 있습니다. 가장 확실한 것은 아닙니다.

다른 질문 즉, 함수를 변수로 전달할 수 있습니까? 대답은 '예'입니다. 사실 이것은 콜백과 클로저가 Javascript에서 처리되는 방식입니다. 예를 들어, jQuery를 당신이 매개 변수로 함수에 전달하는 이벤트 처리기를 바인딩 할 때 :

jQuery("#myInputId").click(function() { 
... 
... 
}); 

매개 변수를 전달하는 또 다른 방법은 객체가 jQuery.ajax 예를 들면, 속성과 같습니다

jQuery.ajax({ 
    ... 
    success: function(data) { 
    }, 
    ... 
}); 

두 경우 모두 clickajax은 매개 변수가 일반적인 변수가 아닌 함수임을 이해하고 기대합니다. 예를 들어, 정수 목록을 유지 관리하는 객체가 있고 매개 변수를 예상하는 addElement(int)이라는 메서드가 있다고 가정하면 String을 전달하지 않습니다. 그것은 언어가 강하게 입력되지 않는다는 사실을 제외하면 Javascript에서 같은 방식으로 작동합니다. 따라서 함수가 형식을 명시 적으로 검사하고 예외를 throw하지 않는 한 실제로 형식 불일치 오류가 발생하지 않습니다. 이것은 일반적으로 그러한 언어에서 좋은 습관입니다. 내가 쓰는 Javascript 코드에서이 작업을 시도합니다.

0

x은 액세스 할 때 (읽음) 함수가 호출 될 때 (즉, x()) '새 값 계산'하지 않습니다. 차드 언급 한 바와 같이,이 창 크기를 조정할 때 자동으로 기능을 실행할 수있는 방법은 다음과 같습니다

$(window).resize(function() { 
    // do something 
}); 

질문을 다시 읽은 후 [업데이트] 나는 당신이 overcomplicated 사고 할 수있다 생각 -있다 없다 당신이 무엇을이 찾고있어?

$('#validate').makeFloat({ 
    x: $("#tabs").offset().left + $("#tabs").width(), 
    y: 70, 
    limitY: 700 
}); 
+0

한 번만 계산된다는 점을 제외하고는 닫습니다. 내부적으로 변수로 처리 할 함수를 찾고있었습니다. 따라서 예를 들어 내부적으로 플러그인은 x를 보지만 x를 읽거나 가져올 때 x는 다시 계산됩니다. 이 JQuery \ javascript를 지원하기를 바라고 있었지만 지금은 이것을 수행하기 위해 플러그인에서 구현을 추가해야합니다. .NET의 get 속성 변형입니다. –

+0

설명해 주셔서 감사합니다. – jholster

0

찾고있는 실제 값을 반환하도록 함수를 호출해야합니다. 따라서 실제로 함수를 전달하지 않고 호출하고 즉시 값을 반환합니다. 예 :

$('#validate').makeFloat({ 
    x:function(){ 
    return $("#tabs").offset().left+$("#tabs").width(); 
    }(), 
    y:70, 
    limitY:700 
}); 

함수 호출 후에 extra()에 유의하십시오. 이 함수는 즉시 함수를 호출하므로 찾고자하는 값을 반환합니다.

+0

이것이 내가 찾던 것과 가깝지만, 이는 매개 변수에 직접 함수 (반환 제외)를 넣는 것과 동일합니다. 인라인 함수를 변수로 "형변환"하고 싶었 기 때문에 내부 플러그인이 변수에 액세스 할 때마다 그 함수를 대신 호출했습니다. 다른 게시물에서 나는 그것을 이해하기 때문에 더 많은 플러그인을 추가해야합니다. 기본적으로 Jqeury가 프레임 워크의 일부로 구현되었는지 확인하려고했습니다. –

+0

잡았다, 당연히, 나는 분명히 그 대답으로 생각하지 않고 있었다 – brad

1

나는 이것을 문자열 변수로 처리했다. toString 함수를 악용해야합니다.

function RefString(fn) { this.toString = function() { return String(fn()); }; } 

당신은 너무처럼 사용할 수 있습니다

$("#someDiv").somePlugin({optionValue: new RefString(MyFunc), ... }); 

function MyFunc() { 
    return new Date().getYear().toString(); 
} 

그것은 반드시, 새로운 객체에 함수를 optionValue를 설정하여 사용할 수 있습니다. 그러면이 객체를 읽는 모든 것이 기본적으로 toString 함수의 결과 인 값을 요청합니다.객체가 생성 될 때 지정된 함수를 실행하여 기본 비헤이비어를 무시합니다.

나는 모든 플러그인에서 어떻게 작동할지는 모르지만, 또는 문자열이 필요할 때 작동합니다.

+0

구현을 위해 +1하지만 int를 사용하는 데 문제가있다. 또한 RefString에 대한 문서를 찾을 수 없다. : –

+0

@ Josh : 문서가 없습니다 : RefString이 제 발명입니다. –

+0

아, 정의 된 것을 보지 못했지만 처음 읽었을 때 놓쳐 버렸습니다. –

관련 문제