Refer to javascript function from within itself

后端 未结 12 862
失恋的感觉
失恋的感觉 2020-12-24 06:08

Consider this piece of code

var crazy = function() {
    console.log(this);
    console.log(this.isCrazy); // wrong.
}
crazy.isCrazy = \'totally\';
crazy();
         


        
相关标签:
12条回答
  • 2020-12-24 06:32

    I think you are asking for arguments.callee, but it's deprecated now.

    https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope/arguments/callee

    var crazy = function() {
        console.log(this);
        console.log(arguments.callee.isCrazy); // right.
    }
    crazy.isCrazy = 'totally';
    crazy();
    // ouput =>
    // DOMWindow
    // totally
    
    0 讨论(0)
  • 2020-12-24 06:32

    As rfw said, this is the most straight forward way to go if the function has one single name:

    var crazy = function() {
        console.log(crazy);
        console.log(crazy.isCrazy);
    };
    
    crazy.isCrazy = 'totally';
    crazy();
    

    In case it may have different names, or you wanted to pass it around, it must be wrapped in a closure:

    var crazy = (function(){
        var that = function() {
            console.log(that);
            console.log(that.isCrazy);
        };
        return that;
    })();
    
    crazy.isCrazy = 'totally';
    crazy();
    
    0 讨论(0)
  • 2020-12-24 06:36

    how can I get the function to refer to itself?

    The idea of 'itself' does not exist with functions. What you need is an object and not just a function. An object has knowledge of itself available through the keyword 'this'. Within a function, 'this' points to the global object - in this case the window object. But if you use your function as a constructor function to create an object (using the new operator) then the object's 'this' pointer will point to the object itself.

    i.e this points to the object if you write:

    var anObject = new crazy();
    

    So you can re-write your code as follows:

    var crazy = function() {
        this.printMe = function(){
            console.log(this);
            console.log(this.isCrazy); 
        }
    }
    
    var anObject = new crazy(); //create an object
    anObject.isCrazy = 'totally'; //add a new property to the object
    anObject.printMe(); //now print
    

    In case you wish to add the property before the object is created, then you have to add the property to the function's prototype as follows:

    var crazy = function() {
        console.log(this);
        console.log(this.isCrazy); 
    }
    
    crazy.prototype.isCrazy = 'totally'; //add the property to the function's prototype
    var anObject = new crazy(); //invoke the constructor
    

    See more on my blog for a detailed explanation of these concepts with code-samples.

    0 讨论(0)
  • 2020-12-24 06:39

    This has to deal with the scope of the function crazy. If can pass any scope to a function using the function call().

    Instead of

    crazy();
    

    Use

    crazy.call(crazy);
    

    For details refer
    http://odetocode.com/blogs/scott/archive/2007/07/05/function-apply-and-function-call-in-javascript.aspx
    https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/Call
    http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx

    0 讨论(0)
  • 2020-12-24 06:42

    Easiest way to make the function itself available in its body is to do var crazy = function crazy2() { crazy2(); }, it's okay for crazy and crazy2 to have the same name since the first occurrence is the name in the outer scope and the second is the name in the function body.

    Or simply do function crazy() { crazy(); } which will define crazy in both scopes.

    0 讨论(0)
  • 2020-12-24 06:43

    Are you actually trying to create an object 'class'?

    function crazy(crazyState) {
       this.isCrazy = crazyState;
       console.log(this);
       console.log(this.isCrazy);
    }
    crazy.prototype.alertMe = function() { alert('I am '+ this.isCrazy +' crazy.'); }
    
    var crazyObj = new crazy('totally');
    crazyObj.alertMe();
    
    crazyObj.isCrazy = 'not';
    crazyObj.alertMe();
    
    0 讨论(0)
提交回复
热议问题